從PHP 5.3-5.5開始,你不能輕易做到這一點。
只有少數幾種方法可以確定進行呼叫時「當前」類是什麼。他們全部都會返回未分類的課程。
class First {
public function test1() { echo get_called_class(); }
public function test2() { print_r(debug_backtrace()); }
public function test3() { echo get_class($this); }
public function test4() { echo __CLASS__; }
public static function test5() { echo get_called_class(); }
}
class_alias('First', 'Second');
$aliased = new Second();
$aliased->test1(); // First
$aliased->test2(); // array(0 => array(... [object] => First Object, ...))
$aliased->test3(); // First
$aliased->test4(); // First
Second::test5(); // First
3v4l demo。
這是因爲class_alias
不會使用新名稱創建新類,它將在類列表中創建指向與原始類相同的類的另一個條目。當您要求PHP查找正在使用的類時,它會查找原始類,而不是別名。
如果你需要創建一個新的類,只不過是具有不同名稱的原始類,你需要通過繼承來完成。您可以使用eval
動態地執行此操作。我不敢相信我會推薦eval
的東西。好惡。
class First {
public function test1() { echo get_called_class(); }
public function test2() { print_r(debug_backtrace()); }
public function test3() { echo get_class($this); }
public function test4() { echo __CLASS__; }
public static function test5() { echo get_called_class(); }
}
function class_alias_kinda($original, $alias) {
eval("class $alias extends $original {}");
}
class_alias_kinda('First', 'Second');
$aliased = new Second();
$aliased->test1(); // Second
$aliased->test2(); // array(0 => array(... [object] => Second Object, ...))
$aliased->test3(); // Second
$aliased->test4(); // First (this is expected)
Second::test5(); // Second
3v4l demo。
這可能不適用於所有情況。在PHP中,私有成員可以通過後代類看到而不是,所以這可能會讓您的代碼非常可怕。
我個人建議不要走樣。它只會以淚結束。 – GordonM 2012-02-10 15:03:38
除非使用可怕的debug_backtrace()方法,否則不能使用... bar :: test()不在bar類中調用test(),它是foo類的重複或克隆;它在foo類本身中調用test(),它恰好也有一個bar的別名,所以自然get_called_class()返回「foo」。 – 2012-02-10 15:09:07
Dup http://stackoverflow.com/questions/6245705/get-top-level-class-name-when-inheritance-and-class-alias-is-used – CBusBus 2012-02-10 15:15:31