PHP静态类变量在初始实例化后仍保持值

时间:2014-10-01 23:36:12

标签: php oop

我有:

class A {
    static $instances = 0;
    public $instance;

    public function __construct() {
        $this->instance = ++self::$instances;
    }
}

$a = new A();
$b = new A();

echo "<pre>";
print_r($a);
print_r($b);
echo "</pre>";

输出:

A Object
(
    [instance] => 1
)
A Object
(
    [instance] => 2
)

我知道静态变量在退出函数后仍保留其值,但这是在类上下文中。为什么在这个类上下文中,类在创建新实例时仍保留变量。

任何对官方文档的引用都会有所帮助。

3 个答案:

答案 0 :(得分:2)

静态变量不与类的任何特定实例/对象相关联。  同样适用于类方法中的静态变量...(http://php.net/manual/en/language.oop5.static.php中的注释)

  

因此,如果在函数内部将变量声明为静态,则它是静态的   对于整个类及其所有实例,而不是每个对象。

  

静态和非静态成员之间的区别仅在于   非静态成员绑定到类的实例,尽管是静态的   member绑定到类,而不是特定的实例。那   是的,静态成员由类的所有实例共享,尽管a   每个类实例都存在非静态成员。

答案 1 :(得分:1)

我必须从Java文档中读取这些内容以了解原因:

  

当从同一个类蓝图创建多个对象时,   它们每个都有自己独特的实例变量副本。

     

有时,您希望拥有所有对象共有的变量。   这是通过静态修改器完成的。有的领域   声明中的static修饰符称为静态字段或类   变量。他们与班级有关,而不是与班级有关   宾语。该类的每个实例都共享一个类变量,即   在内存中的一个固定位置。任何对象都可以更改a的值   类变量......

答案 2 :(得分:0)

新的实例化不保留静态变量,而是增加类的$ instances,然后将结果保存到实例化的$ instance中。