2010-04-19 19 views
8

Teniendo en cuenta el siguiente caso:métodos PHP quedar anulado de clase hija

<?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() {} 
} 

¿Cómo puedo obtener una lista de los métodos (y preferiblemente vars clase) que se reemplaza en ChildClass?

Gracias, Joe

EDIT: Fijo mal se extiende. Cualquier método, no solo los públicos.

+2

Creo que te refieres clase 'ChildClass extiende ParentClass' – webbiedave

Respuesta

14

La reflexión es correcta, pero tendrías que hacerlo así:

$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 
    } 
} 

Lo mismo para Propiedades, solo debería usar getProperties() en su lugar.

+0

Este es el camino. Simplemente use 'getMethods()' luego foreach a través de ellos llamando 'getDeclaringClass() -> getName()'. Si name! = Nombre de clase, entonces ha sido anulado. Lo mismo se puede hacer con 'getProperties()' – webbiedave

+0

lol. No me di cuenta de que era un trabajo en progreso o no habría agregado mi comentario. – webbiedave

+0

@webbiedave Sentí que todavía era demasiado abstracto para captarlo. Es bastante fácil cuando sabes cómo hacerlo, pero para alguien nuevo en la API puede ser difícil. Además, fue un buen ejercicio :) – Gordon

4

Puede utilizar ReflectionClass para lograrlo:

$ref = new ReflectionClass('ChildClass'); 

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

Esta es la salida:

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

) 

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

) 

Consulte el manual para obtener información más útil en la reflexión: http://uk3.php.net/manual/en/class.reflectionclass.php

+0

@Janci: 1 para la clase de reflexión y sí, es muy útil :) – Sarfraz

+2

no creo que esto funcionaría si ChildClass se llegó a declarar como extender ParentClass –

+0

Esto haría también devuelve cualquier clase y propiedades agregadas regulares que no sobrescriban un método o propiedad principal – Gordon

Cuestiones relacionadas