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


В PHP в чем разница между

getcwd()
dirname(__FILE__)

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

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

Возвращает:

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

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

Author: hakre, 2010-02-02

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__).

 46
Author: Thom Wiggers, 2018-03-06 00:13:31

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

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

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

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

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


Правка: Я был неправ.

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

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

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

Они должны быть другими.

 1
Author: Daniel A. White, 2010-02-02 14:48:31

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

cd foo
php bin/test.php

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

 1
Author: commonpike, 2015-12-18 10:08:25