静态属性不存在于对象中

时间:2015-12-26 17:55:44

标签: php

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
)

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

2 个答案:

答案 0 :(得分:2)

静态属性是类的属性(所有实例),而不是特定实例的属性。这是另一个班级......

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() );

答案 1 :(得分:-2)

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

normal_a和static a是properties。当您转储对象时,它返回属性及其值。