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
)
对象中是否存在静态属性?静态变量或属性是在不同实例的上下文中保留变量值的方法吗?
答案 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。当您转储对象时,它返回属性及其值。