Forget vincolante ritardo statico, ho bisogno di ritardo statico __FILE__
-
01-10-2019 - |
Domanda
Sto cercando la get_called_class()
equivalente per __FILE__
... Forse qualcosa di simile get_included_file()
?
Ho un insieme di classi che vorrebbe sapere che cosa directory esistono in Qualcosa di simile a questo:.
<?php
class A {
protected $baseDir;
public function __construct() {
$this->baseDir = dirname(__FILE__);
}
public function getBaseDir() {
return $this->baseDir;
}
}
?>
E in qualche altro file, in qualche altra cartella ...
<?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.
?>
Ora, avrei potuto fare qualcosa del ghetto, come l'aggiunta di $this->baseDir = dirname(__FILE__)
ad ogni classe che estende, ma che sembra un po '... ghetto. Dopo tutto, stiamo parlando di PHP 5.3, giusto? Non è questo dovrebbe essere il futuro?
C'è un altro modo per ottenere il percorso del file in cui è stata dichiarata una classe?
Soluzione
Che cosa succede se non si utilizza __FILE__
ma una variabile indipendente e imposta la variabile a __FILE__
in ogni 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();
si devono ancora ridichiarare la struttura in ogni classe, ma non il metodo
Altri suggerimenti
Hai provato a assegnandole come membro statico della classe?
<?php
class Blah extends A {
protected static $filename = __FILE__;
}
(non testata, e statica più di ereditarietà di classe diventa molto divertente ...)
Si potrebbe usare debug_backtrace () . Probabilmente non si vuole, però.
Provato:
protected static $filename = __FILE__;
static::$filename
non funziona.
Sembra che la costante è registrato quando la classe viene caricata, che non è "in ritardo".
Non sono sicuro che fosse possibile prima, ma ciò che oggi è stato meglio per me sta usando riflessione:
$basePath = new \ReflectionObject($this);
$dir = dirname($basePath->getFileName());