Забудьте о поздней статической связке, мне нужен поздний статический __File__
-
01-10-2019 - |
Вопрос
Я ищу get_called_class()
эквивалент для __FILE__
... может быть что-то вроде get_included_file()
?
У меня есть набор классов, которые хотели бы знать, в каком каталоге они существуют. Что-то вроде этого:
<?php
class A {
protected $baseDir;
public function __construct() {
$this->baseDir = dirname(__FILE__);
}
public function getBaseDir() {
return $this->baseDir;
}
}
?>
А в каком-то другом файле, в какой-то другой папке ...
<?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.
?>
Теперь я мог бы сделать что-то гетто, как добавление $this->baseDir = dirname(__FILE__)
К каждому удлинению класса, но это кажется немного ... гетто. В конце концов, мы говорим о PHP 5.3, верно? Разве это не должно быть будущим?
Есть ли другой способ получить путь к файлу, где был объявлен класс?
Решение
Что если вы не используете __FILE__
но отдельная переменная и установить переменную в __FILE__
в каждом классе
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();
Вы все еще должны решить свойство в каждом классе, но не метод
Другие советы
Вы пытались назначить его как статический член класса?
<?php
class Blah extends A {
protected static $filename = __FILE__;
}
(Непроверенные, и статики плюс класс наследство становится очень веселым ...)
Вы могли бы использовать debug_backtrace (). Отказ Вы, вероятно, не хотите, хотя.
Испытано:
protected static $filename = __FILE__;
static::$filename
Не работает.
Похоже, что постоянная зарегистрирована, когда класс загружен, что не «поздно».
Не уверен, что это было возможно раньше, но то, что было лучше для меня сегодня, использует отражение:
$basePath = new \ReflectionObject($this);
$dir = dirname($basePath->getFileName());