php - PHP 中静态属性的行为

标签 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。

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

最佳答案

该行为实际上符合预期。请注意,如果不使用 session 、cookie 或某种数据库,您无法在请求之间共享属性或值。这是因为 http 是一种所谓的“无状态协议(protocol)”,这几乎意味着每次请求时,应用程序都会从​​头开始重新构建。

请注意以下示例:

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)也发生了几乎相同的情况。但您可以做其他事情,这可能正是您所期望的:

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!';

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

希望这有帮助。

关于php - PHP 中静态属性的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19691831/

相关文章:

php - 防止其他人使用我的 conn.php 文件

javascript - 表格中的 Google 饼图单值

php - 如何在 DHTML 中设置非标准语言

php - 将 php 数组传递给 jqplot 图表

java - JAR 中的静态变量在进程之间共享?

c++ - 在 cpp 文件中设置静态枚举变量的正确方法

c++ - 自动销毁静态对象

PHP/MYSQL - 将多行插入一列,通过 phpmyadmin 工作但仅部分通过 myqli 准备语句?

c++ - 在C++中初始化构造函数中的静态成员变量错误

c# - ConcurrentDictionary 线程安全到我可以将它用于静态缓存的程度吗?