В 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 исполняемого файла).