Php 对象中不存在静态属性
结果是:Php 对象中不存在静态属性,php,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 Obj
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
)
普通和静态是属性。转储对象时,它返回属性及其值 静态属性是类(所有实例)的属性,而不是特定实例的属性。这是另一门课
SubObject Object
(
[normal_a] => 1
[static_a] => 1
)
所有的狗都是哺乳动物,换句话说,整个“类”的狗都是哺乳动物,因此在类级别(不是在类的每个实例中)存储$species
属性是有意义的。并非所有的狗都有相同的毛发颜色,这是一个名为“Dog”的类的特定实例的属性
因此,由设计print\r
函数的人决定,它只打印特定于实例的属性,而不是整个类(或所有实例集)的所有属性。这个设计决策是有道理的。特别是对于那些定义了10个甚至100个要用作常量的属性的类:您不希望在每次进行调试时都看到所有这些属性
仅供参考,如果你的应用程序确实需要获取静态值,我认为这是可行的
class Dog {
public static $species = 'mammal';
public $furColour;
public function __construct($furColour) {
$this->furColour = $furColour;
}
}
$myDog = new Dog('brown');
事实并非如此。您可以自己尝试,也可以更仔细地阅读问题:)print_r((新ReflectionClass('SubObject'))->getStaticProperties());这对我理解这个概念有很大帮助,谢谢。
print_r( (new ReflectionClass('SubObject'))->getStaticProperties() );