我似乎已經在PHP擴展靜態類的麻煩。在PHP擴展靜態類 - 避免了多個類別的共享變量擴展類
PHP代碼:
<?php
class InstanceModule {
public static $className = 'None';
public static function PrintClassName() {
echo self::$className . ' (' . __CLASS__ . ')<br />';
}
}
class A extends InstanceModule {
public static function Construct() {
self::$className = "A";
}
}
class B extends InstanceModule {
public static function Construct() {
self::$className = "B";
}
}
?>
我的調用代碼,以及我所期待:
<?php
//PHP Version 5.3.14
A::PrintClassName(); //Expected 'None' - actual result: 'None'
B::PrintClassName(); //Expected 'None' - actual result: 'None'
A::Construct();
A::PrintClassName(); //Expected 'A' - actual result: 'A'
B::PrintClassName(); //Expected 'None' - actual result: 'A'
B::Construct();
A::PrintClassName(); //Expected 'A' - actual result: 'B'
B::PrintClassName(); //Expected 'B' - actual result: 'B'
A::Construct();
A::PrintClassName(); //Expected 'A' - actual result: 'A'
B::PrintClassName(); //Expected 'B' - actual result: 'A'
?>
實際完成輸出:
None (InstanceModule)
None (InstanceModule)
A (InstanceModule)
A (InstanceModule)
B (InstanceModule)
B (InstanceModule)
A (InstanceModule)
A (InstanceModule)
所以這裏發生了什麼(從看起來)是,只要我在任何一個擴展類上設置self::$className
,它就會覆蓋var可以從其他班上學習。我想這是因爲我使用靜態類,只能有,而不是簡單地將其複製到兩個A
和B
一個InstanceModule
類,因爲是我以前的extends
理解。我試過使用關鍵字static::$className
來代替,但似乎沒有區別。
如果有人能指引我在這裏做錯的正確方向,以及如何解決這個問題,這將是可愛的。
編輯: 要澄清,這個代碼我想要做什麼,但顯然是一個可怕的解決辦法,因爲這會毀了擴展和重用功能的整體思路:
<?php
class A {
public static $className = 'None';
public static function PrintClassName() {
echo self::$className . ' (' . __CLASS__ . ')<br />';
}
public static function Construct() {
self::$className = "A";
}
}
class B {
public static $className = 'None';
public static function PrintClassName() {
echo self::$className . ' (' . __CLASS__ . ')<br />';
}
public static function Construct() {
self::$className = "B";
}
}
?>
類抽象似乎並沒有讓我的不同(雖然,我可能會做是錯誤的)。正如在OP中提到的,我已經嘗試過使用'static'關鍵字,並且最後在兩個擴展類中重新定義className('public static $ className ='None')實際上導致'PrintClassName()'輸出'None '儘管'self :: $ className'仍然在被定義。 – h2ooooooo