常量类与全局常量

时间:2014-01-24 11:41:21

标签: php constants

我正在开发一个项目,其中所有全局常量都已在一个名为Constants的类中定义,例如

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()可能很慢但是肯定要调用类属性也不是最有效的方法吗?

编辑:还有一些函数有条件,因此函数被称为

3 个答案:

答案 0 :(得分:2)

清除问题:配置容器相对于全局define()配置常量有什么优势?

优势是OOP提供的所有优势:数据抽象和封装继承多态更好的设计模式集成

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

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:

<?php
$config   = new ConfigurationDev;
$tracking = new Tracking($config);
...

班级跟踪:

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类中,而不是放在Constant / Configuration容器中。

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();
        }
    }
}

现在,您可以使用辅助类所依赖的不同配置集:

$config = new ConfigurationLive;
$helper = new Helper($config);
$value  = $helper->getValueByUrl($_SERVER['REQUEST_URI']);

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

答案 1 :(得分:0)

您还可以通过简短的方式获取Constants::MIN_VALUE等常量。亲自尝试一下。

答案 2 :(得分:0)

如果你问的是类常量与全局范围中定义的常量的优点,我会说类常量可以是一种更清晰的方法,因为它的范围有限。在使用它的类中定义MAX_VALUE常量也是有意义的,而不是在其他地方。

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