2017-10-27 1 views
0

Ich frage mich, ob es möglich ist, die Vererbung einer Klasse auf eine statische Weise zu überprüfen.PHP überprüfen Vererbung auf eine statische Weise

In Fällen, bekomme ich nur einen Klassennamen mit seinem Namespace ich tun kann:

$oObject = new $sClassName(); 
    if(is_a($oObject, $sParentClassName)) { return true; } 

Aber hier ist es zwingend erforderlich, eine Instanz dieser Klasse zu haben.

Die einzige statische Überprüfung ich bisher gefunden habe, ist die folgende:

if(method_exists($sClassName, $sMethodNameFromParent)) { return true; } 

Aber nur für eine Methode Überprüfung ist nicht gut, weil ich nicht sicher sein kann, ob die betreffende Klasse aus, dass geerbt bestimmter Elternteil, irgendein anderer Elternteil oder implementiert es alles von selbst.

Gibt es eine Möglichkeit, die Vererbung in einer statischen Weise zu überprüfen? Vielen Dank im Voraus!

+0

http://php.net/manual/en/reflectionclass hat. getparentclass.php? – xmike

+0

Warum brauchen Sie das? – axiac

+0

@xmike: also schlagen Sie vor, eine while-Schleife zu verwenden, um alle Eltern zu durchlaufen, bis ich den gesuchten finde oder die Wurzel erreiche? – Akerus

Antwort

1

Sie können dazu Reflection::isSubclassOf verwenden.

class A {} 
class D {} 
class B extends D {} 
class C extends B {} 

$reflected = new ReflectionClass('C'); 

echo $reflected->isSubclassOf('B'); // true 
echo $reflected->isSubclassOf('D'); // true 
echo $reflected->isSubclassOf('A'); // false 

keine Instanz von C erstellt wird, und funktioniert sogar, wenn die Klasse __construct Argumente

+0

Das funktioniert wie ein Zauber! Bei der Suche nach 'ReflectionClass-> isSubclassOf()' habe ich über 'is_subclass_of ($ sClassName, $ sParentName)' gearbeitet, was ohne die Instantiierung einer ReflectionClass funktioniert. Benutzt einer der beiden die Funktionalität des anderen? – Akerus

0
$oObject = new $sClassName(); 
if(get_parent_class($oObject) == $sParentClassName) { return true; } 

PHP function to get parent class name

+0

Dies funktioniert nur, wenn es für ein direktes Parent überprüft wird, d. H. Es wird false zurückgegeben, wenn nach Eltern eines Elternteils gesucht wird. – Kaspars

+0

Dies ist keine statische Überprüfung. Dies instanziiert ein Objekt, das ich nicht wollte. – Akerus