我试图了解静态属性是如何工作的。我的例子:
class Model_Cart{
static public $_a;
}
我在不同的脚本中创建了这个类的对象。脚本 1:
Model_Cart::$_a = true;
var_dump(Model_Cart::$_a);
输出为“真”。
但是如果我在之后执行第二个脚本:
var_dump(Model_Cart::$_a)
输出为 NULL。
我希望静态变量在所有类实例之间共享。你能解释一下这种行为吗?
我试图了解静态属性是如何工作的。我的例子:
class Model_Cart{
static public $_a;
}
我在不同的脚本中创建了这个类的对象。脚本 1:
Model_Cart::$_a = true;
var_dump(Model_Cart::$_a);
输出为“真”。
但是如果我在之后执行第二个脚本:
var_dump(Model_Cart::$_a)
输出为 NULL。
我希望静态变量在所有类实例之间共享。你能解释一下这种行为吗?
行为实际上与预期的一样。请注意,如果不使用会话、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
正如你所看到的,你在脚本一中做什么并不重要,因为脚本二只是不知道 no 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!';
如您所见,静态值不是特定于对象实例,而是特定于整个类,因此可用于实例化该特定类的所有对象。
希望这可以帮助。
您不能跨请求共享变量 - 它们需要通过 aPOST或GET请求发送。