我有:
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
)
我知道静态变量在退出函数后仍保留其值,但这是在类上下文中。为什么在这个类上下文中,类在创建新实例时仍保留变量。
任何对官方文档的引用都会有所帮助。
答案 0 :(得分:2)
静态变量不与类的任何特定实例/对象相关联。 同样适用于类方法中的静态变量...(http://php.net/manual/en/language.oop5.static.php中的注释)
因此,如果在函数内部将变量声明为静态,则它是静态的 对于整个类及其所有实例,而不是每个对象。
和
静态和非静态成员之间的区别仅在于 非静态成员绑定到类的实例,尽管是静态的 member绑定到类,而不是特定的实例。那 是的,静态成员由类的所有实例共享,尽管a 每个类实例都存在非静态成员。
答案 1 :(得分:1)
我必须从Java文档中读取这些内容以了解原因:
当从同一个类蓝图创建多个对象时, 它们每个都有自己独特的实例变量副本。
有时,您希望拥有所有对象共有的变量。 这是通过静态修改器完成的。有的领域 声明中的static修饰符称为静态字段或类 变量。他们与班级有关,而不是与班级有关 宾语。该类的每个实例都共享一个类变量,即 在内存中的一个固定位置。任何对象都可以更改a的值 类变量......
答案 2 :(得分:0)
新的实例化不保留静态变量,而是增加类的$ instances,然后将结果保存到实例化的$ instance中。