木有標題所說的那麼簡單!!
問題是 :
PHP中 A類繼承了B類,如何在A類中擷取B類的類名
實際使用狀況是:
B類是一個基類,多個類A,C,D.....需要繼承B類.我想在B類中寫一些日誌,來記錄A類的運行情況
回複內容:
木有標題所說的那麼簡單!!
問題是 :
PHP中 A類繼承了B類,如何在A類中擷取B類的類名
實際使用狀況是:
B類是一個基類,多個類A,C,D.....需要繼承B類.我想在B類中寫一些日誌,來記錄A類的運行情況
我的方式比較簡單,在B類中定義一個屬性,B的建構函式裡__CLASS__賦值給這個屬性,子類裡調用這個屬性就知道B的類名了。
代碼:
class B{
protected $name = ''; public function __construct(){ $this->name = __CLASS__; }}class A extends B{ public function _show(){ echo $this->name; }}$temp = new A();$temp->_show();
定義一個函數就行了唄。
基類和子類是可以互相調用的。
你在B類(字類)寫一個函數:
private function getChildName(){ return __CLASS__;}
你在A類(基類)調用即可:
$this->getChildName();
多個繼承要想在子類擷取父類名 1.使用反射 2.使用回調(包括子父類間調用) 3.在父類定義self類方法。
樓主提的問題好像是:
因為A,C,D都是繼承的B,但是B裡面的函數需要得到「是A,還是C」?
class Base { public function log() { // 目標類,輸出:A、C echo static::class; //echo get_called_class(); //echo get_class($this); // 基類,輸出:Base //echo __CLASS__; //echo self::class; }}class A extends Base {}class C extends Base {}echo (new A)->log(); // 輸出: Aecho (new C)->log(); // 輸出: C
如果你的需求是在A裡面,得知繼承的誰,這可以用到反射了
// 類外獲得$a = new A();echo get_parent_class($a);//類中獲得class C extends Base { public function log1() { echo get_parent_class($this); }}// 反射,取出所有extends的父級// 如上,在C類中,$a換成$this即可$class = new ReflectionClass($a);$parents = [];while ($class = $class->getParentClass()) { // 查詢 implements 用 getInterfaces $parents[] = $class->getName();}print_r($parents);
> 更多資訊,自己看
調試
反射
函數
get_called_class
get_class
get_class_methods
get_class_vars
get_object_vars
get_parent_class
method_exists