2010-06-10 9 views
36

¿Cómo obtener la ruta de la clase actual, desde un método heredado?¿Cómo obtener la ruta de acceso de una clase derivada de un método heredado?

Tengo el siguiente:

<?php // file: /parentDir/class.php 
    class Parent { 
     protected function getDir() { 
     return dirname(__FILE__); 
     } 
    } 
?> 

y

<?php // file: /childDir/class.php 
    class Child extends Parent { 
     public function __construct() { 
     echo $this->getDir(); 
     } 
    } 
    $tmp = new Child(); // output: '/parentDir' 
?> 

La constante __FILE__ siempre apunta a la fuente de archivo del archivo que se encuentra, independientemente de la herencia.
Me gustaría obtener el nombre de la ruta para la clase derivada.

¿Hay alguna elegante forma de hacer esto?

Podría hacer algo en la línea de $this->getDir(__FILE__);, pero eso significaría que tengo que repetirme con bastante frecuencia. Estoy buscando un método que ponga toda la lógica en la clase principal, si es posible.

Actualización:
solución aceptada (por Palantir):

<?php // file: /parentDir/class.php 
    class Parent { 
     protected function getDir() { 
     $reflector = new ReflectionClass(get_class($this)); 
     return dirname($reflector->getFileName()); 
     } 
    } 
?> 

Respuesta

58

Usando ReflectionClass::getFileName con este te llevará a la nombredir la clase Child se define en.

$reflector = new ReflectionClass("Child"); 
$fn = $reflector->getFileName(); 
return dirname($fn); 

Usted puede obtener el nombre de la clase de un objeto con get_class() :)

26

Sí. Construyendo sobre la respuesta de Palantir:

class Parent { 
     protected function getDir() { 
     $rc = new ReflectionClass(get_class($this)); 
     return dirname($rc->getFileName()); 
     } 
    } 
+2

sí, esta es la conclusión lógica con la respuesta de Palantir. – Jacco

10

No se olvide, ya que 5.5 se puede , lo que sería mucho más rápido que llamar get_class($this). La solución aceptada se vería así:

protected function getDir() { 
    return dirname((new ReflectionClass(static::class))->getFileName()); 
} 
5

Si está utilizando Compositor para autoloading puede recuperar el directorio sin reflexión.

$autoloader = require 'project_root/vendor/autoload.php'; 
// Use get_called_class() for PHP 5.3 and 5.4 
$file = $autoloader->findFile(static::class); 
$directory = dirname($file); 
+0

¡Compañero, he pasado aproximadamente 4 horas hoy buscando una manera de hacer esto sin usar Reflection !! ¡Gracias! –

+0

dulce geesuz !!! –

Cuestiones relacionadas