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

WBOY
Freigeben: 2016-09-29 09:33:03
Original
1301 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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

<code>$this->getChildName();</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

> 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

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage