我对标题描述的内容存在误解,我想知道是否有另一种方法可以实现我在那里寻找的东西。我有一个抽象类,它声明了一个没有值的静态属性,我从它实例化了定义该静态属性值的子类。基类还根据第一个静态属性值定义了另一个静态属性值,但问题是子类正在为其他子类中定义的最后一个属性值丢失第一个属性值,然后第二个属性从父类中获取错误值。这段代码比我解释的更好地展示了它:abstract class A{ protected static $name; protected static $path; public function __construct() { static::$path = static::$name."Path"; } public function getPath() { return static::$path; }}class B extends A{ protected static $name = "B"; }class C extends A{ protected static $name = "C"; }$b = new B();$c = new C();echo $b->getPath();我希望 echo 打印“Bpath”,但不幸的是它打印“CPath”。如果我评论实例化 C 类的行,那么打印效果很好。编辑: 问题是如果我执行此代码:abstract class A{ protected static $name; protected static $path; public function __construct() { static::$path = static::$name."Path"; } public function getPath() { return static::$path; } public function getName() { return static::$name; }}class B extends A{ protected static $name = "B"; }class C extends A{ protected static $name = "C"; }$b = new B();$c = new C();echo $b->getName();印刷的名字是“B”,很好。因此,即使使用 static:: 关键字,在子类属性中重新定义值的事实也不会产生与在构造函数中这样做相同的结果。
1 回答
偶然的你
TA贡献1841条经验 获得超3个赞
静态属性$path只在类上定义一次A。从任何地方设置static::$path都将始终设置A::$path,因此该值在所有类之间共享。
protected static $path;如果你在两个子类上声明,你会看到不同的结果,例如:
class B extends A {
protected static $name = "B";
protected static $path;
}
现在每个类都有自己的静态$path属性,并且可以独立设置。
尽管使用实例属性而不是使用静态属性向后弯曲会更有意义:
abstract class A {
protected static $name;
protected $path;
public function __construct() {
$this->path = static::$name . 'Path';
}
public function getPath() {
return $this->path;
}
}
- 1 回答
- 0 关注
- 136 浏览
添加回答
举报
0/150
提交
取消