2012-02-10 35 views
6

我有一個類爲其他類名設置類別別名。當通過別名類在這個類中調用函數時,我需要知道使用了哪個別名。有沒有辦法在PHP中做到這一點?在PHP中,如何在使用class_alias時獲取被別名的類?

我曾嘗試下面的代碼:

class foo 
{ 
    public static function test() 
    { 
    var_dump(get_called_class()); 
    } 
} 

class_alias('foo', 'bar'); 

foo::test(); 
bar::test(); 

,輸出:

string 'foo' (length=3) 
string 'foo' (length=3) 

但我想bar::test();輸出string 'bar' (length=3)代替。抓住吸管,__CLASS__get_class()都產生相同的結果。我似乎無法找到任何可以幫助我解決這個問題的PHP文檔,但希望我可以忽略一些東西。

如何在使用class_alias時調用別名類?

+5

我個人建議不要走樣。它只會以淚結束。 – GordonM 2012-02-10 15:03:38

+0

除非使用可怕的debug_backtrace()方法,否則不能使用... bar :: test()不在bar類中調用test(),它是foo類的重複或克隆;它在foo類本身中調用test(),它恰好也有一個bar的別名,所以自然get_called_class()返回「foo」。 – 2012-02-10 15:09:07

+0

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

回答

7

從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中,私有成員可以通過後代類看到而不是,所以這可能會讓您的代碼非常可怕。

相關問題