2010-01-06 20 views
9

Estoy construyendo un marco de prueba de unidades para PHP y tenía curiosidad si hay una manera de obtener una lista de métodos de objetos que excluye métodos de la clase. Así que dado esto:Listar todos los métodos de una clase dada, excluyendo los métodos de la clase padre en PHP

class Foo 
{ 

    public function doSomethingFooey() 
    { 
     echo 'HELLO THERE!'; 
    } 
} 

class Bar extends Foo 
{ 
    public function goToTheBar() 
    { 
     // DRINK! 
    } 
} 

Quiero una función que, teniendo en cuenta el parámetro de retorno new Bar():

array('goToTheBar'); 

SIN necesidad de crear una instancia de Foo. (Esto significa que get_class_methods no funcionará).

+0

En respuesta a sus comentarios, no le pedí que creara una instancia nueva de Foo, le pedí que utilizara una cadena STATIC para acceder a la clase STATICALLY. Aprenda Scopes Genius ... –

+0

Como su respuesta no está disponible, no puedo verificar esto, pero creo que su afirmación era similar a "si crea una instancia de Bar que instanciará automáticamente a Foo". El problema no es mi conocimiento del alcance, el problema es que su publicación hace referencia tanto a algo en un nivel estático como a la instancia. – cwallenpoole

+0

Mi solución fue '$ class_methods = get_class_methods (" Bar ");' ... que no instancia nada. –

Respuesta

26

Uso ReflectionClass, por ejemplo:

$f = new ReflectionClass('Bar'); 
$methods = array(); 
foreach ($f->getMethods() as $m) { 
    if ($m->class == 'Bar') { 
     $methods[] = $m->name; 
    } 
} 
print_r($methods); 
+0

Solo para ampliar esta respuesta, necesitaba leer los métodos que aún no había cargado la aplicación. Pude ejecutar include ('path/to/class.php'); $ f = new ReflectionClass ('Clase'); Esta fue una gran solución. ¡Gracias! –

2
$class_methods = get_class_methods('Bar'); 

From the PHP Documenation

esto no va a crear una instancia de la clase, y le permitirá obtener una matriz de todos los métodos de clases.

No estoy completamente seguro de que esto no devuelva los métodos de clase primaria, pero get_class_methods funcionará para las clases desinstaladas. Si lo hace, puede usar la respuesta de Alix para eliminar el método principal de la matriz. O que Lukman use el aspecto de ingeniería inversa de la base de código interno de PHP para obtener los métodos.


Por cierto, si escribe en new Bar(), se va a crear una nueva instancia de Foo, como barra se extiende Foo. La única forma en que no puedes crear instancias de Foo es haciendo referencia a ella estáticamente. Por lo tanto, su solicitud:

I want a function which will, given the parameter new Bar() return: 

No tiene una solución posible. Si proporciona new Bar() como argumento, creará una instancia de la clase.

+2

Aww Man .. Ahora me siento mal por llamar a un Desarrollador de software sénior por no leer el manual ... Lo superaré ... –

+0

Primero, me gustaría señalar que esto en realidad no responde la pregunta, y es smarmy. – cwallenpoole

+0

A continuación, me gustaría sugerir que podría ser necesario considerar el hecho de que puede haber una buena razón por la cual no deseo crear una instancia de Foo como una instancia separada. Un ejemplo podría ser el hecho de que Foo es un Singleton, lo que significa que no puede crear instancias de Foo y Bar. – cwallenpoole

5

Puede utilizar get_class_methods() sin crear instancias de la clase:

$ class_name - El nombre de la clase o una instancia objeto.

Así que la siguiente funcionaría:

$bar_methods = array_diff(get_class_methods('Bar'), get_class_methods('Foo')); 

Suponiendo métodos no se repiten en la clase padre. Aún así, Lukman's answer hace un mejor trabajo. =)

+0

Prefiero esta respuesta. Quería obtener todos los métodos de la clase actual, excluyendo padre. Aunque esto no es lo que el OP solicitó, podría ser útil para alguien, en algún lugar: 'array_diff (get_class_methods (__ CLASS __), get_class_methods (get_parent_class()))' – billynoah

Cuestiones relacionadas