2014-01-24 60 views
2

我的工作,所有的全局常量都在一个名为常量类中定义的项目,例如常量类VS全局常量

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

编辑:另外一些功能有因此,为什么函数调用

+2

为什么要有静态方法?常量:: MIN_VALUE将完全相同。 – vascowhite

+0

@vascowhite请参阅编辑 – Pattle

+0

这没有任何意义。 – vascowhite

回答

2

清除问题:配置容器相对全局define() ed配置参数的优点是什么?

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

这个帖子的读者似乎有点困惑,并且专注于你的课而不是主要问题。也clearify这一点,让我给你举个例子:

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

很好的回答。谢谢! – Pattle

0

你也可以做越来越像常量的Constants::MIN_VALUE短的方式他们的条件。亲自尝试一下。

+0

是的,我可以。但是其中一些功能执行条件,因此需要调用 – Pattle

+1

@Pattle:“执行**条件**”?要返回**常量**的值? – Jon

+0

好吧,我明白了。但我认为声明一个可变的全局并不好,因为它打破了良好软件工程的原则。如果全局变量没有存储在一个文件中,它也可能混乱你的代码。 –

0

如果您在询问类常量与全局作用域中定义的常量的优点,我会说由于其范围有限,类常量可能是更清洁的方法。在使用它的类中定义一个常量,而不是在其他地方定义常量。

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