__DIR__ VS используя отражение - PullRequest
3 голосов
/ 08 июня 2011

В Symfony2 я видел код, подобный приведенному ниже:

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 08 июня 2011

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

2 голосов
/ 25 октября 2012

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

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

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

0 голосов
/ 08 июня 2011

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

0 голосов
/ 08 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...