对象中不存在静态属性


static properites does not exist into the object

class SubObject
{
    static $static_a= 0;
    public $normal_a=0;
    public function __construct() {
        ++$this->normal_a;
        ++self::$static_a;
    }
}
$obj1 = new SubObject();
print_r($obj1);

结果是 :

SubObject Object
(
    [normal_a] => 1
)

我的问题是为什么它不将输出显示为:

SubObject Object
(
    [normal_a] => 1
    [static_a] => 1
)

对象中不存在静态属性吗?静态变量或属性是在不同实例的上下文中保存变量值的方法吗?

静态属性是类(所有实例(的属性,而不是特定实例的属性。 这是另一节课...

class Dog {
    public static $species = 'mammal';
    public $furColour;
    public function __construct($furColour) {
        $this->furColour = $furColour;
   }
}
$myDog = new Dog('brown');
所有的狗都是哺乳动物,

换句话说,整个"类"的狗都是哺乳动物,因此将$species属性存储在类级别(而不是在类的每个实例中(是有意义的。 并非所有狗都有相同的毛皮颜色,这是称为"狗"的类的特定实例的属性。

因此,根据设计print_r函数的人的决定,它只打印特定于实例的属性,而不是整个类(或所有实例集(的所有属性。 这个设计决策是有道理的。 特别是对于类,例如,定义 10 个甚至 100 个属性以使用常量:您不希望每次print_r调试时都看到所有这些。

仅供参考,如果您的应用程序确实需要获取静态值,我认为这有效

print_r( (new ReflectionClass('SubObject'))->getStaticProperties() );
SubObject Object
(
[normal_a] => 1
[static_a] => 1
)

normal_a 和静态 a 是属性。转储对象时,它将返回属性及其值。