Как получить путь к текущему классу из унаследованного метода?
У меня есть следующее:
<?php // file: /parentDir/class.php class Parent { protected function getDir() { return dirname(__FILE__); } } ?>
а также
<?php // file: /childDir/class.php class Child extends Parent { public function __construct() { echo $this->getDir(); } } $tmp = new Child(); // output: '/parentDir' ?>
Константа __FILE__
всегда указывает на исходный файл файла, в котором он находится, независимо от наследования.
Я хотел бы получить имя пути для производного класса.
Есть ли элегантный способ сделать это?
Я мог бы что-то сделать по линиям $this->getDir(__FILE__);
но это означало бы, что я должен повторять себя довольно часто. Я ищу метод, который по возможности ставит всю логику в родительский класс.
Обновить:
Принятое решение (от Palantir ):
<?php // file: /parentDir/class.php class Parent { protected function getDir() { $reflector = new ReflectionClass(get_class($this)); return dirname($reflector->getFileName()); } } ?>
Используя ReflectionClass::getFileName
с этим, вы получите имя dirname, на котором определен класс Child
.
$reflector = new ReflectionClass("Child"); $fn = $reflector->getFileName(); return dirname($fn);
Вы можете получить имя класса объекта с помощью get_class()
🙂
Да. Основываясь на ответе Палантира:
class Parent { protected function getDir() { $rc = new ReflectionClass(get_class($this)); return dirname($rc->getFileName()); } }
Не забывайте, что начиная с версии 5.5 вы можете использовать ключевое слово class
для разрешения имени класса , что было бы намного быстрее, чем вызов get_class($this)
. Принятое решение будет выглядеть так:
protected function getDir() { return dirname((new ReflectionClass(static::class))->getFileName()); }
Если вы используете Composer для автозагрузки, вы можете получить каталог без отражения.
$autoloader = require 'project_root/vendor/autoload.php'; // Use get_called_class() for PHP 5.3 and 5.4 $file = $autoloader->findFile(static::class); $directory = dirname($file);