2013-07-18 64 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

这是一个演示构造函数,只是一个例子。 –