2010-01-06 3 views
9

Sto costruendo un framework di testing di unità per PHP e ero curioso di sapere se esiste un modo per ottenere un elenco di metodi di oggetti che esclude il genitore i metodi della classe. Quindi, dato queste:Elenca tutti i metodi di una data classe, esclusi i metodi della classe genitrice in PHP

class Foo 
{ 

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

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

Voglio una funzione che, dato il parametro di new Bar() ritorno:

array('goToTheBar'); 

SENZA bisogno di istanziare un'istanza di Foo. (Ciò significa che get_class_methods non funzionerà).

+0

In risposta ai tuoi commenti, non ti stavo chiedendo di creare un'istanza di una nuova istanza di Foo, ti stavo chiedendo di usare una stringa STATICA per accedere alla classe STATICAMENTE. Learn Scopes Genius ... –

+0

Dato che la tua risposta non è disponibile, non posso verificarlo, ma credo che la tua affermazione fosse qualcosa di simile a "se istanziate Bar che istanzia automaticamente Foo". Il problema non è la mia conoscenza dell'ambito, il problema è che il tuo post si riferiva sia a qualcosa di statico che all'istanza. – cwallenpoole

+0

La mia soluzione era '$ class_methods = get_class_methods (" Bar ");' ... che non crea un'istanza nulla. –

risposta

26

Usa ReflectionClass, ad esempio:

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

Giusto per espandere questa risposta, avevo bisogno di leggere i metodi che non erano ancora stati caricati dall'Applicazione. Sono stato in grado di eseguire include ('path/to/class.php'); $ f = new ReflectionClass ('Class'); Questa è stata una grande soluzione. Grazie! –

2
$class_methods = get_class_methods('Bar'); 

From the PHP Documenation

questo non sarà un'istanza della classe, e vi permetterà di ottenere una vasta gamma di tutti i metodi di classi.

Non sono completamente sicuro che questo non restituirà i metodi della classe genitore, ma get_class_methods funzionerà per le classi non coerenti. Se lo fa, puoi usare la risposta di Alix per rimuovere il metodo del genitore dall'array. Oppure Lukman usa l'aspetto del reverse engineering del codice interno di PHP per ottenere i metodi.


A proposito, se si digita in new Bar(), sta andando a creare una nuova istanza di Foo, come bar estende Foo. L'unico modo in cui non puoi istanziare Foo è fare riferimento ad esso staticamente. Pertanto, la tua richiesta:

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

Non ha alcuna soluzione possibile. Se si assegna come argomento new Bar(), verrà istanziata la classe.

+2

Aww Man .. Ora mi sento male per aver chiamato un Senior Software Developer per non aver letto il manuale .... Ci passerò sopra ... –

+0

Per prima cosa, vorrei solo far notare che questo in realtà non è rispondi alla domanda ed è smilzo. – cwallenpoole

+0

Inoltre, vorrei suggerire che potrebbe essere necessario considerare il fatto che potrebbe esserci una buona ragione per cui non desidero istanziare Foo come istanza separata. Un esempio potrebbe essere il fatto che Foo è un Singleton, il che significa che non è possibile creare un'istanza di Foo e Bar. – cwallenpoole

5

È possibile utilizzare get_class_methods() senza istanziare la classe:

$ class_name - Il nome della classe o un'istanza oggetto.

Così il seguente avrebbe funzionato:

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

Supponendo metodi non ci sono ripetute nella classe padre. Ancora, Lukman's answer fa un lavoro migliore. =)

+0

Preferisco questa risposta. Volevo ottenere tutti i metodi della classe corrente, escludendo i genitori. Sebbene questo non sia quello che l'OP chiedeva, potrebbe essere utile a qualcuno, da qualche parte: 'array_diff (get_class_methods (__ CLASS __), get_class_methods (get_parent_class()))' – billynoah