【问题标题】:Behavior of static property in PHPPHP中静态属性的行为
【发布时间】:2013-10-30 19:13:21
【问题描述】:

我正在尝试了解静态属性的工作原理。我的示例:

class Model_Cart{
    static public $_a;
}

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

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

输出为“真”。

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

var_dump(Model_Cart::$_a)

输出为 NULL。

我希望静态变量在所有类实例之间共享。你能解释一下这种行为吗?

【问题讨论】:

  • 你在var_dump之前执行了什么脚本?
  • 您是否在另一个请求中运行第二个脚本?因为请求之间不共享变量:)
  • 仅供参考,您没有任何对象或类实例。
  • @Shamil 在 var_dump 之前我没有执行任何操作。这只是测试脚本
  • @Tamara 这就是你的答案,你不能跨请求共享变量。

标签: php static-members


【解决方案1】:

行为实际上与预期一致。请注意,如果不使用会话、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!';

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 虽然可以使用S_SESSION,但使用$_SESSION 存储一些东西并不理想。虽然类是标题Cart,但我不能说使用$_SESSION是合适的
    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2021-07-22
    • 2013-10-03
    • 2014-08-27
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多