OUBLIEZ liaison statique fin, j'ai besoin statique fin __FILE__
-
01-10-2019 - |
Question
Je cherche l'équivalent get_called_class()
pour __FILE__
... Peut-être quelque chose comme get_included_file()
?
J'ai un ensemble de classes qui voudrait savoir quel répertoire ils existent dans quelque chose comme ceci:.
<?php
class A {
protected $baseDir;
public function __construct() {
$this->baseDir = dirname(__FILE__);
}
public function getBaseDir() {
return $this->baseDir;
}
}
?>
Et dans un autre fichier, dans un autre dossier ...
<?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.
?>
Maintenant, je pouvais faire quelque chose de ghetto, comme l'ajout $this->baseDir = dirname(__FILE__)
à chaque classe d'extension, mais qui semble un peu ... ghetto. Après tout, nous parlons PHP 5.3, non? Ne serait-ce censé être l'avenir?
Y at-il une autre façon d'obtenir le chemin d'accès au fichier où une classe a été déclarée?
La solution
si vous n'utilisez pas __FILE__
mais une variable séparée et définissez la variable à __FILE__
dans chaque classe
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();
vous avez encore à redéclarer la propriété dans chaque classe, mais pas la méthode
Autres conseils
Avez-vous essayé l'assigner en tant que membre statique de la classe?
<?php
class Blah extends A {
protected static $filename = __FILE__;
}
(et non testés, ainsi que l'héritage de statics classe devient très amusant ...)
Vous pouvez utiliser debug_backtrace () . Vous ne voulez probablement pas, cependant.
Testé:
protected static $filename = __FILE__;
static::$filename
ne fonctionne pas.
On dirait que la constante est enregistrée lorsque la classe est chargée qui ne sont pas « en retard ».
Je ne sais pas qu'il était possible avant, mais ce qui était le mieux pour moi utilise la réflexion aujourd'hui:
$basePath = new \ReflectionObject($this);
$dir = dirname($basePath->getFileName());