Frage

Im Folgenden ist ein Beispiel Klassenhierarchie und Code. Was ich suche ist eine Möglichkeit, um festzustellen, ob ‚ChildClass1‘ oder ‚ChildClass2‘ die statische Methode whoAmI hatte () aufgerufen, ohne es in jedem Kind Klasse neu zu implementieren.

<?php

abstract class ParentClass {

    public static function whoAmI () {

        // NOT correct, always gives 'ParentClass'
        $class = __CLASS__;

        // NOT correct, always gives 'ParentClass'. 
        // Also very round-about and likely slow.
        $trace = debug_backtrace();
        $class = $trace[0]['class'];

        return $class;
    }
}

class ChildClass1 extends ParentClass {

}

class ChildClass2 extends ParentClass {

}

// Shows 'ParentClass'
// Want to show 'ChildClass1'
print ChildClass1::whoAmI(); 
print "\n";

// Shows 'ParentClass'
// Want to show 'ChildClass2'
print ChildClass2::whoAmI();
print "\n";
War es hilfreich?

Lösung 3

Nun, da PHP 5.3 in der freien Natur weit verbreitet ist, wollte ich zusammen eine Zusammenfassung Antwort auf diese Frage stellen neu verfügbare Techniken zu reflektieren.

Wie in den anderen Antworten erwähnt, PHP 5.3 eingeführt static Stichwort. Auch eine neue get_called_class() Funktion ist ebenfalls verfügbar das kann nur innerhalb einer Klassenmethode (instance oder statisch) verwendet werden.

Für die Zwecke der Klasse zu bestimmen, wie in dieser Frage gestellt wurde, die get_called_class() Funktion angemessen ist:

<?php

abstract class ParentClass {

    public static function whoAmI () {
        return get_called_class();
    }

}

class ChildClass1 extends ParentClass {

}

class ChildClass2 extends ParentClass {

}

// Shows 'ChildClass1'
print ChildClass1::whoAmI(); 
print "\n";

// Shows 'ChildClass2'
print ChildClass2::whoAmI();
print "\n";

Die Benutzer beigetragen Noten für get_called_class() umfassen ein paar Beispiel-Implementierungen, die durch den Einsatz von debug_backtrace() in PHP 5.2 als auch funktionieren sollen.

Andere Tipps

Ich glaube, was Sie sich beziehen ein PHP-Fehler bekannt ist. Php 5.3 zielt dieses Problem zu lösen mit einer neuen Späten statischen Bindung Funktion.

http: // www .colder.ch / news / 2007.08.24 / 28 / late-static-Bindings-expl.html

Klasse Identifizierung ist oft ein Symptom nicht gut verstanden Polymorphismus.

Die Kunden von ChildClass1 und ChildClass2 sollen nicht zwischen ihnen müssen unterscheiden.

Es gibt keinen Ort, an dem jede Klasse über someObject.whoAmI() fragen sollte.

Wenn Sie den Drang zu schreiben if someObject.whoAmI() == 'ChildClass1' { do X(someObject) } Sie wirklich eine X() Methode zum Parent mit verschiedenen Implementierungen in den verschiedenen ChildClasses hinzufügen sollte.

Diese Art von „Laufzeittypidentifikation“ kann fast immer mit richtig polymorpher Klasse Design ersetzt werden.

Ab PHP 5.3, es wird mit der Verwendung des statisch Stichwort , aber jetzt ist es nicht möglich.

Nein. Warten Sie PHP 5.3.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top