【问题标题】:Constants class vs global constants [closed]常量类与全局常量[关闭]
【发布时间】:2014-01-24 11:41:21
【问题描述】:

我正在做一个项目,例如,所有全局常量都定义在一个名为 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() 可能会很慢,但调用类属性肯定也不是最有效的方法吗?

编辑:有些函数也有条件,因此为什么要调用函数

【问题讨论】:

  • 为什么要有静态方法? Constants::MIN_VALUE 的工作原理完全相同。
  • 这没有任何意义。
  • 为什么 2 个人关闭投票这个“基于意见”?与配置容器和全局定义的常量相比,有明显的优点和缺点。这与意见无关。似乎问题查看者与 OP 本人处于相同的软件设计经验水平:-)

标签: php constants


【解决方案1】:

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

优势就是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 类中,而不是放在常量/配置容器中。

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,了解这些内容,您将获得比您的问题的读者更高水平的软件工程。祝你好运!

【讨论】:

  • 很好的答案。谢谢!
【解决方案2】:

您也可以使用简单的方法来获取像Constants::MIN_VALUE 这样的常量。自己试试吧。

【讨论】:

  • 是的,我可以。但是有些函数执行条件所以需要调用函数
  • @Pattle:“执行条件”?返回 constant 的值?
  • 好吧,我明白了。但我认为声明一个全局变量并不好,因为它违反了良好软件工程的原则。如果全局变量没有存储在一个文件中,它也可能会使您的代码混乱。
  • 问题不是如何改进代码,问题是容器类相比define有什么优势
  • 那么他的做法是正确的。 @Pattle 在类的方法中维护了他的验证,极大地促进了代码的可重用性。
【解决方案3】:

如果您要询问类常量与在全局范围内定义的常量的优势,我会说类常量由于其范围有限而可能是一种更简洁的方法。在使用它的类中定义 MAX_VALUE 常量也是有意义的,而不是在其他地方。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多