Различие Между getcwd () и dirname (__ ФАЙЛ __)? Который я должен использовать?

В PHP, между чем различие

getcwd()
dirname(__FILE__)

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

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

Возвраты:

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

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

25
задан hakre 25 December 2012 в 01:30
поделиться

2 ответа

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

51
ответ дан 28 November 2019 в 20:43
поделиться

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

Переместите ваш файл в другую директорию, скажем 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";

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

1
ответ дан 28 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: