Получение пути унаследованного класса в PHP
Вопрос
Я пытаюсь получить абсолютный путь класса PHP, который наследует от суперкласса. Похоже, это должно быть просто. Я думаю, что код ниже объясняет его так же кратко:
// myapp/classes/foo/bar/AbstractFoo.php
class AbstractFoo {
public function getAbsolutePathname() {
// this always returns the pathname of AbstractFoo.php
return __FILE__;
}
}
// myapp/classes/Foo.php
class Foo extends AbstractFoo {
public function test() {
// this returns the pathname of AbstractFoo.php, when what I
// want is the pathname of Foo.php - WITHOUT having to override
// getAbsolutePathname()
return $this->getAbsolutePathname();
}
}
Причина, по которой я не хочу переопределять getAbsolutePathname()
Составлено, будет много классов, которые расширяют абстрактные зерна, потенциально много разных мест на файловой системе (FOO на самом деле модуль), и кажется, что нарушение сухого.
Решение
Ну, вы могли бы использовать отражение:
public function getAbsolutePathname() {
$reflector = new ReflectionObject($this);
return $reflector->getFilename();
}
Я не уверен, что вернет полный путь или просто имя файла, но я не вижу никаких других соответствующих методов, поэтому попробуйте ...
Другие советы
Насколько я знаю, для этого нет чистого обходного пути. Волшебные константы __FILE__
а также __DIR__
интерпретируются во время анализа и не динамичны.
То, что я склонен делать, это
class AbstractFoo {
protected $path = null;
public function getAbsolutePathname() {
if ($this->path == null)
die ("You forgot to define a path in ".get_class($this));
return $this->path;
}
}
class Foo extends AbstractFoo {
protected $path = __DIR__;
}
Вы могли бы что-то взломать с debug_backtrace
, но это все еще требует, чтобы вы явно переопределили родительскую функцию в каждом подразделении.
Гораздо легче определить функцию как return __FILE__;
в каждом подраздельном классе. __FILE__
Всегда будет заменено имя файла, в котором он найден, нет способа сделать его иначе.