2011-05-20 11 views
7

ejemplophp ruta del archivo de clase get padres

index.php // Yo sé donde este archivo es

$class = new childclass(); 
$class->__initComponents(); 

somefile.php // Yo sé donde este archivo es

Class childclass extends parentclass { 

} 

someparentfile.php // No sé dónde está este archivo

Class parentclass { 
    function __initComponents(){ 
    //does something 
    } 
} 

Necesito averiguar dónde está algúnparentfile.php.

razón:

estoy depurando algún código php difícil que alguien más escribió, necesito averiguar qué archivo contiene el código que define un parámetro de clase.

me pareció tan lejos como un método de clase llamando a una función que hace esto:

$class->__initComponents();//the parameter is defined somewhere in there 

El problema es que esta función está dentro de un "MyClass" clase padre de la clase $ anteriormente, y tengo ni idea de dónde está la clase de padres.

¿Hay alguna manera o alguna función de depuración con la que pueda averiguar la ubicación de esta clase principal o al menos donde se definió el parámetro?

p.s. descargar toda la aplicación y luego usar la búsqueda de texto no sería razonable.

Respuesta

10

Puede utilizar la reflexión

$object = new ReflectionObject($class); 
$method = $object->getMethod('__initComponents'); 
$declaringClass = $method->getDeclaringClass(); 
$filename = $declaringClass->getFilename(); 

Para más información, lo que es posible con la reflexión-API, consulte the manual

embargo

, en aras de la simplicidad, me sugieren para descargar la fuente y depurar es local.

+0

Conocí objetos de reflexión, pero no tenía idea de que pudieran hacer todo esto. ¡Me salvaste innumerables horas de depuración! : D Encontré el método que estaba buscando, pero todavía no sé dónde está MyClass, parece que MyClass también es una clase extendida –

+0

'$ declarando clase 'en mi ejemplo es la clase, implementa el método. '$ filename' es el nombre del archivo, donde se declara la clase. No importa, si 'MyClass' también se extiende, si quiere saber, dónde' __initComponents() 'está definido. Puede usar 'ReflectionClass :: getParentClass()' para obtener Parent-class, si asume que esto lo ayudará. – KingCrunch

+0

Me ayudó a encontrar la clase que necesitaba (el padre más cercano), no la clase que creía necesitar (el padre directo "MyClass"), ahora con getParentClass incluso encontré "MyClass" (que no necesitaba) , pero fue divertido de encontrar), así que arreglé un montón de errores, y todo está bien ahora :) –

3
$object = new ReflectionObject($this); // Replace $this with object of any class. 

    echo 'Parent Class Name: <br>'; 
    echo $object->getParentClass()->getName(); 

    echo '<br>Parent Class Location: <br>'; 
    echo $object->getParentClass()->getFileName();