2014-01-24 64 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是什麼?