Разница между getcwd() и dirname(ФАЙЛ)? Что я должен использовать?
В PHP в чем разница между
getcwd()
dirname(__FILE__)
Они оба возвращают один и тот же результат, когда я повторяю из CLI
echo getcwd()."\n";
echo dirname(__FILE__)."\n";
Возвращает:
/home/user/Desktop/testing/
/home/user/Desktop/testing/
Какой из них лучше всего использовать? Имеет ли это значение? Что предпочитают более продвинутые разработчики PHP?
3 answers
__FILE__
является магической константой, содержащей полный путь к исполняемому файлу. Если вы находитесь внутри включения, его путь будет содержимым __FILE__
.
Итак, с этой настройкой:
/folder/random/foo.php
<?php
echo getcwd() . "\n";
echo dirname(__FILE__) . "\n" ;
echo "-------\n";
include 'bar/bar.php';
/folder/random/bar/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
:
Интерфейс командной строки 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__)
.
Попробуй это.
Переместите свой файл в другой каталог, скажем testing2
.
Это должно быть результатом.
/home/user/Desktop/testing/
/home/user/Desktop/testing/testing2/
Я бы подумал, что getcwd
используется для файловых операций, где dirname(__FILE__)
использует магическую константу __FILE__
и использует фактический путь к файлу.
Правка: Я был неправ.
Ну, вы можете изменить рабочий каталог, с chdir
.
Так что, если вы сделаете это...
chdir('something');
echo getcwd()."\n";
echo dirname(__FILE__)."\n";
Они должны быть другими.
Если вы вызываете файл из командной строки, разница очевидна.
cd foo
php bin/test.php
В пределах test.php , getcwd()
вернет foo
(ваш текущий рабочий каталог) и dirname(__FILE__)
вернет bin
(имя файла, выполняющегося).