Forget späte statische Bindung, ich brauche spät statische __FILE__
-
01-10-2019 - |
Frage
Ich suche nach dem get_called_class()
Äquivalent für __FILE__
... Vielleicht so etwas wie get_included_file()
?
Ich habe eine Reihe von Klassen, die würden gerne wissen, was Verzeichnis sie existieren in etwas wie folgt aus:.
<?php
class A {
protected $baseDir;
public function __construct() {
$this->baseDir = dirname(__FILE__);
}
public function getBaseDir() {
return $this->baseDir;
}
}
?>
Und in einer anderen Datei in einem anderen Ordner ...
<?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.
?>
Nun könnte ich etwas Ghetto tun, wie das Hinzufügen von $this->baseDir = dirname(__FILE__)
zu jedem und jeder abgeleitete Klasse, aber das scheint ein wenig ... Ghetto. Immerhin reden wir über PHP 5.3, nicht wahr? Ist das nicht soll die Zukunft sein?
Gibt es einen anderen Weg, um den Pfad zur Datei zu gelangen, wo eine Klasse deklariert wurde?
Lösung
Was ist, wenn Sie nicht verwenden __FILE__
aber eine separate Variable und die Variable auf __FILE__
in jeder Klasse
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();
Sie haben immer noch die Eigenschaft in jeder Klasse zu deklarieren, aber nicht die Methode
Andere Tipps
Haben Sie versucht, es als statisches Element der Klasse zuweisen?
<?php
class Blah extends A {
protected static $filename = __FILE__;
}
(Ungeprüfte und Statik sowie Klassenvererbung wird sehr lustig ...)
könnten Sie debug_backtrace () . Sie wollen wahrscheinlich nicht zu, though.
Im Test:
protected static $filename = __FILE__;
static::$filename
funktioniert nicht.
Es sieht aus wie die Konstante registriert, wenn die Klasse geladen wird, das ist nicht „spät“.
Nicht sicher, dass es möglich war, vor, aber was am besten für mich wurde heute mit Reflexion:
$basePath = new \ReflectionObject($this);
$dir = dirname($basePath->getFileName());