__DIR__ VS с использованием Reflection

В Symfony2 я увидел код, как показано ниже:

if (null === $this->rootDir) {
 $r = new \ReflectionObject($this);
 $this->rootDir = dirname($r->getFileName());
 }

почему бы просто не использовать __DIR__?

if (null === $this->rootDir) {
 $this->rootDir = __DIR__;
 }

В чем разница между ними?

4 ответа

__DIR__ возвращает каталог файла, в котором он вызывается. Код Symphony2 возвращает каталог, где определен класс, который, скорее всего, является другим файлом.


Как указано в руководстве PHP:

  • DIR возвращает каталог файла. Если используется внутри include, возвращается каталог с включенным файлом
  • FILE возвращает полный путь и имя файла. Если используется внутри include, возвращается имя включенного файла.

Таким образом, эти константы всегда возвращают пути файла, в котором они используются. Однако я полагаю, что это не ожидаемое поведение в фрагменте кода, который вы указали. Возможно, код находится в каком-то базовом классе, в то время как он может быть вызван из классов. Если мы хотим получить путь к текущему классу, то первый способ будет правильным.


Я думаю, это потому, что __DIR__ вернет каталог из script, который изначально был вызван. В примере кода вы получите каталог класса объекта. Возможно, я ошибаюсь, хотя еще не пробовал это, но, пожалуйста, поправьте меня, если я буду.


__DIR__ существует только в PHP 5.3. До 5.3 мы должны были использовать dirname(__FILE__) или что-то подобное.

licensed under cc by-sa 3.0 with attribution.