2011-11-26 8 views
13

mam kod php oop:get rodzic rozciąga klasy w 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(); 

Mam kilka klasy nadrzędnej (normalny i streszczenie) i wiele klas potomnych. Klasy potomne rozszerzają klasy nadrzędne. Więc kiedy tworzę egzemplarz dziecka w pewnym momencie, muszę dowiedzieć się, do jakiego rodzica zadzwoniłem.

na przykład funkcja b::test() powróci a

Jak mogę dostać (z mojego kodu) klasę a z mojej klasy B?

dzięki

+4

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

Odpowiedz

16

Twój kod sugeruje, że używasz parent, który w rzeczywistości jest tym, czego potrzebujesz. Problem polega na magicznej zmiennej __CLASS__.

W documentation stany:

Od PHP 5 ta stała zwracana nazwę klasy, jak to zostało zgłoszone.

Która jest to, czego potrzebujemy, ale jak wspomniano w this comment na php.net:

Claude zauważyć, że __CLASS__ zawsze zawiera klasy, która nazywa się, jeśli wolisz mieć klasę, która nazwana metoda używa get_class ($ this) zamiast tego. Działa to jednak tylko w instancjach, a nie w statycznie.

Jeśli potrzebujesz tylko klasy nadrzędnej, istnieje również funkcja do tego. Że jeden nazywa get_parent_class

15

Można używać get_parent_class:

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

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

To będzie również działać, jeśli B::test jest statyczny.

UWAGA: Istnieje niewielka różnica między używaniem get_parent_class bez argumentów a przekazywaniem $this jako argumentem. Gdybyśmy przedłużyć powyższy przykład z:

class C extends B {} 

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

Dostajemy A jako klasy nadrzędnej (macierzystej klasy B, gdzie metoda nazywa). Jeśli zawsze chcesz mieć najbliższego rodzica dla badanego obiektu, powinieneś zamiast tego użyć get_parent_class($this).

10

Można użyć refleksji, aby to zrobić:

Zamiast

parent::__CLASS__; 

użycie

$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

użytkowania class_parents zamiast. Da to szereg rodziców.

<?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