首頁  >  文章  >  後端開發  >  php如何取得目前類別名稱,繼承的問題?

php如何取得目前類別名稱,繼承的問題?

WBOY
WBOY原創
2016-09-29 09:33:031289瀏覽

木有標題所說的那麼簡單!!


問題是 :

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn