В 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
руководства 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__
и использует фактический путь к файлу.
Изменить: я был неправ.
Ну, вы можете изменить рабочий каталог, с chdir
.
Так что если вы это сделаете …
chdir('something'); echo getcwd()."\n"; echo dirname(__FILE__)."\n";
-chdir('something'); echo getcwd()."\n"; echo dirname(__FILE__)."\n";
Это должно быть иначе.
Если вы вызываете файл из командной строки, разница становится ясной.
cd foo php bin/test.php
в test.php getcwd()
вернет foo
(ваш текущий рабочий каталог) и dirname(__FILE__)
будет возвращать bin
(dirname исполняемого файла).