php - modo - que es una clase base en c++
¿Cómo obtener la ruta de una clase derivada de un método heredado? (4)
El uso de ReflectionClass::getFileName
con esto le dará el nombre de directorio en que se definió la clase Child
.
$reflector = new ReflectionClass("Child");
$fn = $reflector->getFileName();
return dirname($fn);
Puede obtener el nombre de clase de un objeto con get_class()
:)
¿Cómo obtener el camino de la clase actual, desde un método heredado?
Tengo lo 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 al archivo fuente del archivo en el que se encuentra, independientemente de la herencia.
Me gustaría obtener el nombre de la ruta para la clase derivada.
¿Hay alguna forma elegante de hacer esto?
Podría hacer algo como $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.
Actualizar:
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());
}
}
?>
No olvide que, desde 5.5, puede usar class
palabra clave class
para la resolución del nombre de clase , que sería mucho más rápido que llamar a get_class($this)
. La solución aceptada se vería así:
protected function getDir() {
return dirname((new ReflectionClass(static::class))->getFileName());
}
Sí. Basándose en la respuesta de Palantir:
class Parent {
protected function getDir() {
$rc = new ReflectionClass(get_class($this));
return dirname($rc->getFileName());
}
}
Si está utilizando Composer para carga automática, 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);