PHP中静态属性的行为

时间:2013-10-30 19:13:22

标签: php static-members

我试图了解静态属性的工作原理。我的例子:

class Model_Cart{
    static public $_a;
}

我在不同的脚本中创建了这个类的对象。脚本1:

 Model_Cart::$_a = true;
 var_dump(Model_Cart::$_a);

输出为“true”。

但是如果我在之后执行第二个脚本:

var_dump(Model_Cart::$_a)

输出为NULL。

我期望静态变量与所有类的实例共享。你能解释一下这种行为吗?

2 个答案:

答案 0 :(得分:2)

行为实际上是预期的。请注意,您不能 - 不使用会话,cookie或某种类型的数据库 - 在请求之间共享属性或值。那是因为http是一种所谓的“无状态协议”,这几乎意味着每次请求都会从头开始重新构建应用程序。

请注意以下示例:

<强> script_number_one.php

$my_var = 'hello world!';
echo $my_var; // does what you think it does

<强> script_number_two.php

echo $my_var; // echoes nothing, or raises a warning that the var doesn't exist

正如你所看到的,你在脚本一中所做的并不重要,因为脚本二只是不知道没有1(并且实际上并不关心)。

你的班级几乎一样。但是你可以做其他事情,这可能是你所期望的:

class myStaticClass {
    public static $static_var = 'Hello world!';

    public function alter_static_value($new_value) {
        self::$static_var = $new_value;
    }

}

$_obj_1 = new myStaticClass;
$_obj_2 = new myStaticClass;

echo $_obj_1::$static_var; // echoes 'Hello World!'
echo $_obj_2::$static_var; // also echoes 'Hello world!'

$_obj_1->alter_static_value('Bye world!');
echo $_obj_2::$static_var; // echoes 'Bye world!';

如您所见,静态值不是特定于对象实例,而是特定于整个类,因此可以访问实例化该特定类的所有对象。

希望这有帮助。

答案 1 :(得分:1)

您无法在请求之间共享变量 - 它们需要通过POSTGET请求发送。