2017-09-01 85 views
2

我有一個抽象類,延伸類的類名:PHP:動態得到擴展當前類

abstract class MyAbstract { 
    public function getName(){echo static::class;} 
} 

class MyExtends extends MyAbstract {} 

我想動態地得到任何擴展類的名字時getName()叫做:

$c = new MyExtends(); 
echo $c->getName(); // expect: "MyExtends" 

這非常適用於PHP 5.6+(demo),但我工作的項目僅限於PHP 5.3,我沒有槓桿來改變這種狀況。在該版本中,一個解析錯誤被拋出:

Parse error: syntax error, unexpected T_CLASS, expecting T_STRING or T_VARIABLE or '$'

所以我修改的功能:

public function getName(){echo __CLASS__;} 

當然,這只是呼應了父母的名字 - MyAbstract,所以這是行不通的。我唯一想到的是在每個擴展類中用一個新的實現覆蓋getName(),但這並不能很好地擴展:整個繼承點就是將通用代碼集中在父類中(當然,實際功能不是一個班輪)。

任何想法如何從PHP 5.3中的抽象父類的上下文動態獲取擴展類名?

回答

2

您可以使用get_class獲得類的名稱:

<?php 
abstract class MyAbstract 
{ 
    public function getName() 
    { 
     echo get_class($this); 
    } 
} 

class MyExtends extends MyAbstract 
{ 
} 

$c = new MyExtends(); 
echo $c->getName(); // expect: "MyExtends" 

demo:https://ideone.com/TtMtZ7

上面的代碼應該在所有版本(5.0.4以來)。

+1

謝謝。是的,它按預期工作。請添加一個鏈接到文檔,以改善答案:http://php.net/manual/en/function.get-class.php – BeetleJuice

+0

@BeetleJuice - 鏈接可用,但在德國:P - 改爲英文。謝謝。 –

+0

很酷的網站(ideone.com);我不知道這件事。 – BeetleJuice

2

可能:

public function getName(){get_class($this);} 

還沒雖然進行了測試。

+1

你的直覺是正確的。它的工作原理 – BeetleJuice

+0

非常好。祝你好運 – ASOlivieri