Разница между getcwd () и dirname (__ FILE__)? Какой я должен использовать? - PullRequest
24 голосов
/ 02 февраля 2010

В PHP какая разница между

getcwd()
dirname(__FILE__)

Они оба возвращают один и тот же результат, когда я эхо от CLI

echo getcwd()."\n";
echo dirname(__FILE__)."\n";

Возвращает:

/home/user/Desktop/testing/
/home/user/Desktop/testing/

Какой лучше использовать?Это имеет значение?Что предпочитают более продвинутые разработчики PHP?

Ответы [ 3 ]

50 голосов
/ 02 февраля 2010

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

Итак, с этой настройкой:

/ папки / случайное / foo.php

<?php
echo getcwd() . "\n";
echo dirname(__FILE__) . "\n" ;
echo "-------\n";
include 'bar/bar.php';

/ папки / случайное / бар / bar.php

<?php
echo getcwd() . "\n";
echo dirname(__FILE__) . "\n";

Вы получите этот вывод:

/folder/random
/folder/random
-------
/folder/random
/folder/random/bar

Итак, getcwd() возвращает каталог, в котором вы начали выполнение, тогда как dirname(__FILE__) зависит от файла.

На моем веб-сервере getcwd() возвращает местоположение файла, который изначально был запущен. Используя CLI, он равен тому, что вы получили бы, если бы выполнили pwd. Это подтверждается документацией CLI SAPI и комментарием на справочной странице getcwd:

CLI SAPI, в отличие от других SAPI, НЕ автоматически меняет текущий рабочий каталог на тот, в котором находится запущенный скрипт.

Так как:

thom@griffin /home/thom $ echo "<?php echo getcwd() . '\n' ?>" >> test.php
thom@griffin /home/thom $ php test.php 
/home/thom
thom@griffin /home/thom $ cd ..
thom@griffin /home $ php thom/test.php 
/home

Конечно, см. Также руководство по http://php.net/manual/en/function.getcwd.php

ОБНОВЛЕНИЕ : Начиная с PHP 5.3.0 вы также можете использовать магическую константу __DIR__, которая эквивалентна dirname(__FILE__).

1 голос
/ 18 декабря 2015

Если вы вызываете файл из командной строки, разница очевидна.

cd foo
php bin/test.php

в test.php, getcwd() вернет foo (ваш текущий рабочий каталог), а dirname(__FILE__) вернет bin (имя исполняемого файла).

1 голос
/ 02 февраля 2010

Попробуйте это.

Переместите файл в другой каталог, скажем testing2.

Это должен быть результат.

/home/user/Desktop/testing/
/home/user/Desktop/testing/testing2/

Я думаю, что getcwd используется для файловых операций, где dirname(__FILE__) использует магическую константу __FILE__ и использует фактический путь к файлу.


Редактировать: я был не прав.

Ну, вы можете изменить рабочий каталог с помощью chdir.

Так что, если вы сделаете это ...

chdir('something');
echo getcwd()."\n";
echo dirname(__FILE__)."\n";

Они должны быть разными.

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