Heim > Artikel > Backend-Entwicklung > Wie erhalte ich den aktuellen Klassennamen in PHP? Was ist das Problem mit der Vererbung?
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
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