В PHP, между чем различие
getcwd()
dirname(__FILE__)
Они оба возвращают тот же результат, когда я отзываюсь эхом от CLI
echo getcwd()."\n";
echo dirname(__FILE__)."\n";
Возвраты:
/home/user/Desktop/testing/
/home/user/Desktop/testing/
Который является лучшим для использования? Это имеет значение? Что более усовершенствованным разработчикам PHP предпочитают?
__FILE__
- это магическая константа, содержащая полный путь к выполняемому файлу. Если вы находитесь внутри include, его путь будет содержимым __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
:
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
UPDATE: Начиная с PHP 5.3.0 вы также можете использовать магическую константу __DIR__
, которая эквивалентна dirname(__FILE__)
.
Попробуйте это.
Переместите ваш файл в другую директорию, скажем testing2
.
Это должно быть результатом.
/home/user/Desktop/testing/
/home/user/Desktop/testing/testing2/
Я думаю, что getcwd
используется для файловых операций, а dirname(__FILE__)
использует магическую константу __FILE__
и использует реальный путь к файлу.
Edit: I was wrong.
Ну, вы можете изменить рабочий каталог с помощью chdir
.
Так что если вы это сделаете...
chdir('something');
echo getcwd()."\n";
echo dirname(__FILE__)."\n";
Они должны быть разными.