Как получить путь производного класса от унаследованного метода?

Как получить путь к текущему классу из унаследованного метода?

У меня есть следующее:

<?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);