木有標題所說的那麼簡單!!
問題是 :
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{
<code> protected $name = ''; public function __construct(){ $this->name = __CLASS__; } } class A extends B{ public function _show(){ echo $this->name; } } $temp = new A(); $temp->_show();</code>
定義一個函數就行了唄。
基底類別和子類別是可以互相呼叫的。
你在B類(字類)寫一個函數:
<code>private function getChildName(){ return __CLASS__; } </code>
你在A類(基類)呼叫即可:
<code>$this->getChildName();</code>
多個繼承要想在子類別取得父類別名稱 1.使用反射 2.使用回呼(包括子父類別間呼叫) 3.在父類別定義self類別方法。
樓主提的問題好像是:
因為A,C,D都是繼承的B,但B裡面的函數要得到「是A,還是C」?
<code>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(); // 输出: A echo (new C)->log(); // 输出: C</code>
如果你的需求是在A裡面,得知繼承的誰,這可以用到反射了
<code>// 类外获得 $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);</code>
> 更多信息,自己看
調試
debug_backtrace
反射
ReflectionClass
函數
get_called_class
get_class
get_class_methods
get_class_vars
get_object_vars
get_parent_class
method_exists