2010-04-19 10 views
8

Étant donné le cas suivant:méthodes get PHP surchargées de la classe des enfants

<?php 

class ParentClass { 

    public $attrA; 
    public $attrB; 
    public $attrC; 

    public function methodA() {} 
    public function methodB() {} 
    public function methodC() {} 

} 

class ChildClass extends ParentClass { 

    public $attrB; 

    public function methodA() {} 
} 

Comment puis-je obtenir une liste des méthodes (et de préférence la classe vars) qui sont redéfinie dans ChildClass?

Merci, Joe

EDIT: Correction d'une mauvaise prolonge. Toutes les méthodes, pas seulement publiques.

+2

Je pense que vous voulez dire classe 'ChildClass étend ParentClass' – webbiedave

Répondre

14

La réflexion est correcte, mais vous auriez à le faire comme ceci:

$child = new ReflectionClass('ChildClass'); 

// find all public and protected methods in ParentClass 
$parentMethods = $child->getParentClass()->getMethods(
    ReflectionMethod::IS_PUBLIC^ReflectionMethod::IS_PROTECTED 
); 

// find all parent methods that were redeclared in ChildClass 
foreach($parentMethods as $parentMethod) { 
    $declaringClass = $child->getMethod($parentMethod->getName()) 
          ->getDeclaringClass() 
          ->getName(); 

    if($declaringClass === $child->getName()) { 
     echo $parentMethod->getName(); // print the method name 
    } 
} 

Même pour les propriétés, vous utiliseriez simplement getProperties() à la place.

+0

C'est le chemin. Utilisez simplement 'getMethods()' puis foreach à travers eux en appelant 'getDeclaringClass() -> getName()'. Si name! = Nom de classe, il a été remplacé. La même chose peut être faite avec 'getProperties()' – webbiedave

+0

lol. Je n'ai pas réalisé que c'était un travail en cours ou je n'aurais pas ajouté mon commentaire. – webbiedave

+0

@webbiedave Je sentais que c'était encore trop abstrait pour être saisi. C'est assez facile quand vous savez comment le faire, mais pour quelqu'un de nouveau à l'API, cela peut être difficile. De plus, c'était un bel exercice :) – Gordon

4

Vous pouvez utiliser ReflectionClass pour y parvenir:

$ref = new ReflectionClass('ChildClass'); 

print_r($ref->getMethods()); 
print_r($ref->getProperties()); 

Affichera:

Array 
(
    [0] => ReflectionMethod Object 
     (
      [name] => methodA 
      [class] => ChildClass 
     ) 

) 

Array 
(
    [0] => ReflectionProperty Object 
     (
      [name] => attrB 
      [class] => ChildClass 
     ) 

) 

Voir le manuel pour plus d'informations utiles à la réflexion: http://uk3.php.net/manual/en/class.reflectionclass.php

+0

@Janci: +1 pour la classe de réflexion et oui, il est très utile :) – Sarfraz

+2

Je ne pense pas que cela fonctionnerait si ChildClass a été effectivement déclaré que l'extension ParentClass –

+0

Ce serait retourne également toutes les classes et propriétés ajoutées qui ne remplacent pas une méthode ou une propriété parente. – Gordon

Questions connexes