2011-11-26 9 views
13

Ho il codice php oop:get genitore si estende classe in php

class a { 
    // with properties and functions 
} 

class b extends a { 
    public function test() { 
     echo __CLASS__; // this is b 
     // parent::__CLASS__ // error 
    } 
} 

$b = new b(); 
$b->test(); 

Ho una classe genitore pochi (normale e astratta) e molte classi figlie. Le classi figlie estendono le classi genitore. Quindi, quando istanziato il bambino a un certo punto, ho bisogno di scoprire che genitore ho chiamato.

ad esempio la funzione di b::test() tornerà a

Come posso ottenere (dal mio codice) la classe a dalla mia classe B?

grazie

+4

leggere questo: http://stackoverflow.com/questions/506705/php-get-classname-from-static-call-in-extended-class –

risposta

16

Il codice suggeriva di utilizzare parent, che di fatto è quello che ti serve. Il problema si trova con la variabile magica __CLASS__.

I documentation stati:

Dal PHP 5 questa costante restituisce il nome della classe, come è stato dichiarato.

che è quello che ci serve, ma come già sottolineato in this comment su php.net:

Claude notato che __CLASS__ contiene sempre la classe che viene chiamato in, se si preferisce avere la classe che chiamato il metodo usa invece get_class ($ this). Tuttavia, questo funziona solo con le istanze, non quando viene chiamato staticamente.

Se si ha bisogno solo della classe madre, esiste anche una funzione per questo. Che uno si chiama get_parent_class

15

È possibile utilizzare get_parent_class:

class A {} 
class B extends A { 
    public function test() { 
    echo get_parent_class(); 
    } 
} 

$b = new B; 
$b->test(); // A 

Questo funziona anche se B::test è statico.

NOTA: C'è una piccola differenza tra l'utilizzo di get_parent_class senza argomenti contro il passaggio di $this come argomento. Se estendiamo l'esempio precedente con:

class C extends B {} 

$c = new C; 
$c->test(); // A 

Otteniamo A come la classe genitore (la classe padre di B, dove il metodo viene chiamato). Se vuoi sempre il genitore più vicino per l'oggetto che stai testando, dovresti usare invece get_parent_class($this).

10

È possibile utilizzare la reflection per farlo:

Invece di

parent::__CLASS__; 

uso

$ref = new ReflectionClass($this); 
echo $ref->getParentClass()->getName(); 
11
class a { 
    // with propertie and functions 
} 

class b extends a { 

    public function test() { 
     echo get_parent_class($this); 
    } 
} 


$b = new b(); 
$b->test(); 
6

Usa class_parents invece. Darà una serie di genitori.

<?php 
class A {} 
class B extends A { 
} 
class C extends B { 
    public function test() { 
     echo implode(class_parents(__CLASS__),' -> '); 
    } 
} 

$c = new C; 
$c->test(); // B -> A