我對標題描述的內容存在誤解,我想知道是否有另一種方法可以實現我在那里尋找的東西。我有一個抽象類,它聲明了一個沒有值的靜態屬性,我從它實例化了定義該靜態屬性值的子類。基類還根據第一個靜態屬性值定義了另一個靜態屬性值,但問題是子類正在為其他子類中定義的最后一個屬性值丟失第一個屬性值,然后第二個屬性從父類中獲取錯誤值。這段代碼比我解釋的更好地展示了它: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 關注
- 159 瀏覽
添加回答
舉報
0/150
提交
取消