Forget la ligadura estática, necesito estática finales __FILE__
-
01-10-2019 - |
Pregunta
Estoy buscando el equivalente get_called_class()
para __FILE__
... Tal vez algo así como get_included_file()
?
Tengo un conjunto de clases que le gustaría saber qué directorio existen en algo como esto:.
<?php
class A {
protected $baseDir;
public function __construct() {
$this->baseDir = dirname(__FILE__);
}
public function getBaseDir() {
return $this->baseDir;
}
}
?>
Y en algún otro archivo, en alguna otra carpeta ...
<?php
class B extends A {
// ...
}
class C extends B {
// ...
}
$a = new A;
echo $a->getBaseDir();
$b = new B;
echo $b->getBaseDir();
$c = new C;
echo $c->getBaseDir();
// Annnd... all three return the same base directory.
?>
Ahora, yo podría hacer algo gueto, como la adición de $this->baseDir = dirname(__FILE__)
a todos y cada clase se extiende, pero que parece un poco ... gueto. Después de todo, estamos hablando de PHP 5.3, ¿verdad? ¿No se supone que es el futuro?
¿Hay otra manera de obtener la ruta al archivo donde se declaró una clase?
Solución
¿y si no se utiliza, pero __FILE__
una variable independiente y establece la variable a __FILE__
en cada clase
class A {
protected static $baseDir;
protected $filename = __FILE__; // put this in every file
public function __construct() {
}
public function getBaseDir() {
return dirname($this->filename) . '<br>'; // use $filename instead of __FILE__
}
}
require('bdir/b.php');
require('cdir/c.php');
class B extends A {
protected $filename = __FILE__; // put this in every file
}
$a = new A;
echo $a->getBaseDir();
$b = new B;
echo $b->getBaseDir();
$c = new C;
echo $c->getBaseDir();
todavía tiene que redeclare la propiedad en cada clase, pero no el método
Otros consejos
¿Ha intentado asignar como un miembro estático de la clase?
<?php
class Blah extends A {
protected static $filename = __FILE__;
}
(no probados, y la estática, además de la herencia de clases llega a ser muy divertido ...)
debug_backtrace () . Es probable que no quiere, sin embargo.
Probado:
protected static $filename = __FILE__;
static::$filename
no funciona.
Parece que la constante se ha registrado cuando la clase se carga que no es "tarde".
No estoy seguro de que era posible antes, pero lo que era mejor para mí hoy está utilizando la reflexión:
$basePath = new \ReflectionObject($this);
$dir = dirname($basePath->getFileName());