2011-11-26 9 views
13

tengo el código php oop:get padre extiende la clase en 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(); 

que tienen una clase padre pocos (normal y abstracto), y muchas clases hijas. Las clases secundarias amplían las clases principales. Entonces, cuando instanciar al niño en algún momento, necesito saber a qué padre llamé.

por ejemplo la función b::test() regresará a

¿Cómo puedo obtener (de mi código) a la clase de mi clase B?

gracias

+4

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

Respuesta

16

Su código sugiere que utilizó parent, que de hecho es lo que necesita. El problema radica en la variable mágica __CLASS__.

Los documentation estados:

A partir de PHP 5 esta constante devuelve el nombre de la clase, ya que fue declarado.

que es lo que necesitamos, pero como se ha señalado en this comment en php.net:

Claude señaló que __CLASS__ siempre contiene la clase que se llama en, si se quiere tener la clase que llamado el método use get_class ($ this) en su lugar. Sin embargo, esto solo funciona con instancias, no cuando se llama estáticamente.

Si solo necesita la clase principal, también hay una función para eso. Eso se llama get_parent_class

15

Puede utilizar get_parent_class:

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

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

Esto también funciona si B::test es estática.

NOTA: Hay una pequeña diferencia entre utilizar get_parent_class sin argumentos y pasar $this como argumento. Si extendemos el ejemplo anterior con:

class C extends B {} 

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

Obtenemos A como la clase padre (padre de la clase B, donde se llama al método). Si siempre quiere el padre más cercano para el objeto que está probando, debería usar get_parent_class($this) en su lugar.

10

Puede utilizar la reflexión para hacer eso:

En lugar de

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

Uso class_parents lugar. Le dará una variedad de padres.

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