2013-07-18 59 views
2

是否可以保護定義的變量不被覆蓋(更改值)?我正在製作一個使用插件的系統,並且我想阻止插件編寫器(我)更改某些特定的已定義變量(保存新類實例的對象)。保護獨立變量

事情是這樣的:

Class Foo { 
    function __construct() { 
    return "Hello"; 
    } 
} 
$bar= new Foo(); 

所以後來,我將用我的功能global $bar;但我不希望允許改變像這樣的變量:

$bar = new Foo(); $bar = "New value";

$bar必須始終保持不變(新的Foo()),因爲它將是一個大系統,我不記得我定義的數百個核心變量。

理想情況下,如果我嘗試重新定義它 - php應該拋出致命的錯誤。有這樣的事嗎?

+1

它被稱爲常量。你可以通過'define'關鍵字定義全局常量,或者你可以通過'const CONSTANT ='value';'定義類常量。如果無法更改其值,受保護的VARIABLE不再是變量。 –

+0

我需要在課外保護變量。它將是持有無法重新定義的類實例的對象。 –

+0

@ N.B。我可以在'define'關鍵字中保存類實例嗎?我雖然它只適用於'字符串,'布爾'和'整數/雙/浮動'類型? –

回答

3

這聽起來像Singleton pattern

class Foo 
{ 
    protected static $instance = null; 
    protected function __construct() 
    { 
     throw new Exception('use ::getInstance()'); 
    } 

    public static function getInstance() 
    { 
     if (!isset(static::$instance)) { 
      static::$instance = new static; 
     } 
     return static::$instance; 
    } 
} 

使用:

$bar = Foo::getInstance(); 

任何一個可以重新聲明$吧..但如果他們不會真正的富......他們需要得到的實例;

+0

所以基本上沒有辦法阻止'$ bar'被重新聲明? –

+0

但是,這是最接近我想實現的。等待有人提出更多答案,否則我會接受它。 –

+0

而不是在你的代碼中使用'$ bar',只要你需要它就使用'Foo :: getInstance()'。通過這種方式,您可以確保您始終使用您喜歡的對象,而不是某個變量,其類型您不知道,或者甚至沒有定義。 –

0

爲什麼你的構造函數返回一個字符串?根據定義,構造函數返回對象的引用。

如果你只是想引用一個不能改變的字符串,爲什麼不直接創建一個const呢?

const STRING_THAT_WONT_CHANGE = 'foo'; 
+0

這是一個演示構造函數,只是一個例子。 –