首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常量类与全局常量

常量类与全局常量
EN

Stack Overflow用户
提问于 2014-01-24 11:41:21
回答 3查看 1.7K关注 0票数 3

我正在处理一个项目,在这个项目中,所有全局常量都在一个名为常量的类中定义,例如

代码语言:javascript
复制
class Constants
{

  const MIN_VALUE = 0.0;
  const MAX_VALUE = 1.0;

  public static function getMinValue()
  {
    return self::MIN_VALUE;
  }

  public static function getMaxValue()
  {
    return self::MAX_VALUE;
  }

  public static function getValueDependingOnURL()
  {
    if($_SERVER['REQUEST_URI'] == 'something')
    {
      return self::MIN_VALUE;
    }
    else
    {
      return self::MAX_VALUE;
    }
  }
}

然后在整个代码中使用类似于Constants::getMaxValue()的方法来获取常量的值。这似乎是一种非常奇怪的方法,为什么不直接在最外层的范围内使用define函数呢?我知道define()可能非常慢,但是必须调用类属性也不是最有效的方法?

编辑:还有一些函数在其中有条件,因此函数被调用

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-24 12:33:19

明确问题:define()**ed配置容器相对于全局配置容器的优势是什么?**

OOP的优势在于:数据抽象和封装继承多态性更好的设计模式集成

这篇文章的读者似乎有点困惑,只关注于你的课堂,而不是主要的问题。为了澄清这一点,让我举一个例子:

代码语言:javascript
复制
class Configuration
{
    protected $someValue;
}

class ConfigurationDev extends Configuration
{
    protected $baseUrl = 'http://devel.yoursite.com/';
}

class ConfigurationLive extends Configuration
{
    protected $baseUrl = 'http://www.yoursite.com/';
}

index.php:

代码语言:javascript
复制
<?php
$config   = new ConfigurationDev;
$tracking = new Tracking($config);
...

班级跟踪:

代码语言:javascript
复制
class Tracking
{
    public function __construct(\Configuration $config) {
        if ($config instanceof \ConfigurationLive) {
            // We are in live environment, do track
        } else {
            // Debug Notice: We are NOT in live environment, do NOT track
        }
    }
}

对场景的解释:

想象一下,您希望跟踪用户,但只跟踪实时系统,而不是在您的开发系统上。Tracking类需要一个活动配置,但如果它不是活动配置,则中止(不受影响)。

使用const的类不是最好的,因为const意味着您不想更改变量。不要将变量用于可能发生更改的值。您也不应该使用静态的东西,因为它主要与依赖注入冲突。通过真实的物体!

函数public static function getValueDependingOnURL()应该放在Helper类中,而不是放在常量/配置容器中。

代码语言:javascript
复制
class Helper
{
    protected $config;

    public function __construct(\Configuration $config) {
        $this->config = $config;
        return $this;
    }

    public function getValueByUrl($url) {
        if ($url == 'something') {
            return $config->getMinValue();
        } else {
            return $config->getMaxValue();
        }
    }
}

现在,您可以拥有助手类所依赖的不同的配置集:

代码语言:javascript
复制
$config = new ConfigurationLive;
$helper = new Helper($config);
$value  = $helper->getValueByUrl($_SERVER['REQUEST_URI']);

在我的示例中有很多最佳实践设计模式、代码样式和OOP,了解这些内容,您将获得比您问题的读者更高的软件工程水平。祝好运!

票数 2
EN

Stack Overflow用户

发布于 2014-01-24 11:44:13

您也可以通过简单的方法获取常量,比如Constants::MIN_VALUE。你自己试试吧。

票数 0
EN

Stack Overflow用户

发布于 2014-01-24 12:21:46

如果您询问类常量与全局范围中定义的常量的优点,我想说的是,由于类常量的范围有限,它可以成为一种更干净的方法。另外,在使用它的类中定义MAX_VALUE常量也是有意义的,而不是在其他地方。

但这似乎不适用于您的情况,因为您的Constants类看起来就像一些随机常量的容器。什么MIN_VALUE

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21331766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档