Разница между getcwd() и dirname (__ FILE__)? Что я должен использовать?

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

getcwd()
dirname(__FILE__)

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

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

Возврат:

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

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

Ответ 1

__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 - НЕ автоматически меняет текущий рабочий каталог на тот, в котором находится запущенный script.

Так вот:

[email protected] /home/thom $ echo "<?php echo getcwd() . '\n' ?>" >> test.php
[email protected] /home/thom $ php test.php 
/home/thom
[email protected] /home/thom $ cd ..
[email protected] /home $ php thom/test.php 
/home

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

UPDATE. С PHP 5.3.0 вы также можете использовать магическую константу __DIR__, которая эквивалентна dirname(__FILE__).

Ответ 2

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

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

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

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

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


Изменить: я ошибся.

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

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

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

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

Ответ 3

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

cd foo
php bin/test.php

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