Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erhalte ich den aktuellen Klassennamen in PHP? Was ist das Problem mit der Vererbung?

Wie erhalte ich den aktuellen Klassennamen in PHP? Was ist das Problem mit der Vererbung?

WBOY
WBOYOriginal
2016-09-29 09:33:031289Durchsuche

Es ist nicht so einfach, wie der Titel sagt!!


Die Frage ist:

In PHP erbt Klasse A Klasse B. So erhalten Sie den Klassennamen von Klasse B in Klasse A

Die tatsächlichen Nutzungsbedingungen sind:

Klasse B ist eine Basisklasse und mehrere Klassen A, C, D ... müssen von Klasse B erben. Ich möchte einige Protokolle in Klasse B schreiben, um den Betrieb von Klasse A aufzuzeichnen

Antwortinhalt:

Es ist nicht so einfach, wie der Titel sagt!!


Das Problem ist:

In PHP erbt Klasse A Klasse B. So erhalten Sie den Klassennamen von Klasse B in Klasse A

Die tatsächlichen Nutzungsbedingungen sind:

Klasse B ist eine Basisklasse und mehrere Klassen A, C, D ... müssen Klasse B erben. Ich möchte einige Protokolle in Klasse B schreiben, um den Betrieb von Klasse A aufzuzeichnen

Meine Methode ist relativ einfach. Definieren Sie ein Attribut in Klasse B, weisen Sie diesem Attribut im Konstruktor von B __CLASS__ zu und rufen Sie dieses Attribut in der Unterklasse auf, um den Klassennamen von B zu erfahren.
Code:
Klasse 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>

Definieren Sie einfach eine Funktion.
Basisklassen und Unterklassen können sich gegenseitig aufrufen.

Sie schreiben eine Funktion in Klasse B (Wortklasse):

<code>private function getChildName(){
    return __CLASS__;
}
</code>

Sie können es in Klasse A (Basisklasse) aufrufen:

<code>$this->getChildName();</code>

Wenn Sie den Namen der übergeordneten Klasse in der untergeordneten Klasse durch mehrere Vererbungen erhalten möchten, 1. verwenden Sie Reflektion 2. verwenden Sie Rückrufe (einschließlich Aufrufe zwischen untergeordneten und übergeordneten Klassen) 3. definieren Sie die Methode der Selbstklasse in der übergeordneten Klasse.

Die Frage, die das Poster aufwirft, scheint zu lauten:

Weil A, C und D alle von B geerbt sind, die Funktion in B jedoch wissen muss: „Ist es A oder 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>

Wenn Ihr Bedarf in A liegt, nämlich zu wissen, wer erbt, können Sie Reflexion verwenden

<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>

> Weitere Informationen finden Sie selbst

  • Debugging

    • debug_backtrace

  • Reflexion

    • ReflectionClass

  • Funktion

    • get_called_class

    • get_class

    • get_class_methods

    • get_class_vars

    • get_object_vars

    • get_parent_class

    • method_exists

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn