2010-02-02 10 views
21

W PHP, jaka jest różnica międzyRóżnica między getcwd() i dirname (__ FILE__)? Którego powinienem użyć?

getcwd() 
dirname(__FILE__) 

Oboje zwracają ten sam wynik, kiedy echo z CLI

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

Powroty:

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

co jest najlepszym z nich korzystać ? Czy to ma znaczenie? Czemu bardziej preferowani są programiści PHP?

+0

Nie zapomnij, że 'dirname (__ FILE __)' jest takie samo jak '__DIR__' –

Odpowiedz

46

__FILE__ to magic constant zawierający pełną ścieżkę do pliku, który wykonujesz. Jeśli znajdujesz się wewnątrz pliku włączającego, jego ścieżka będzie zawierać treść __FILE__.

Więc z tej konfiguracji:

/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"; 

Otrzymujesz to wyjście:

/folder/random 
/folder/random 
------- 
/folder/random 
/folder/random/bar 

Więc getcwd() zwraca katalog, w którym rozpoczął wykonywanie, podczas gdy plik jest dirname(__FILE__) zależne.

Na moim serwerze internetowym getcwd() zwraca lokalizację pliku, który pierwotnie rozpoczął wykonywanie. Używanie CLI jest równe temu, co uzyskałbyś, gdybyś wykonał pwd.To jest obsługiwany przez documentation of the CLI SAPI i komentarzem na getcwd ręcznego stronie:.

CLI SAPI ma - w przeciwieństwie do innych SAPIs - NIE automatycznie zmienia bieżący katalog roboczy, aby ta, którą rozpoczął skrypt rezyduje w

Więc jak:

[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 

oczywiście, patrz także instrukcję w http://php.net/manual/en/function.getcwd.php

AKTUALIZACJA: Od PHP 5.3.0 można również użyć stałej magicznej __DIR__, która jest odpowiednikiem dirname(__FILE__).

+2

Doskonały przykład jest doskonały! Dziękuję Ci! – Urda

+0

Czy istnieje szybki sposób na pobranie katalogu głównego skryptu z załączonego skryptu. Więc wewnątrz dołączonego skryptu, który będzie w innym katalogu, chcę znać katalog głównego skryptu, który go zawiera. – CMCDragonkai

+0

@CMCDragonkai: Nie wiem, czy istnieje lepszy sposób, ale można spróbować ustawić stałą w pliku głównym na wartość '__DIR__'. –

1

Spróbuj tego.

Przenieś plik do innego katalogu, powiedz testing2.

To powinien być wynik.

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

Myślę getcwd służy do operacji na plikach, gdzie dirname(__FILE__) wykorzystuje magiczną stałą __FILE__ i wykorzystuje rzeczywistą ścieżkę do pliku.


Edytuj: Myliłem się.

Można zmienić katalog roboczy przy pomocy chdir.

Więc jeśli to zrobisz ...

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

te powinny być różne.

+0

Nie, tym razem to tylko echa/home/user/Desktop/testing/testing2 dwa razy – Urda

+0

OK, więc pozwól mi być pewnym, że mam to ... dirname (__ FILE__) * zawsze * wytworzy lokalizację używanego pliku. Podczas gdy getcwd zwróci bieżący działający katalog dla uruchomionego procesu PHP (takiego jak mój skrypt wiersza poleceń). Zakładając to, jeśli użyję funkcji include ("path/to/some/file/from/chdir /"); powinno być w stanie znaleźć plik odniesienia? – Urda

1

Jeśli wywołasz plik z wiersza poleceń, różnica jest jasna.

cd foo 
php bin/test.php 

ciągu test.php, getcwd() wróci foo (bieżący katalog roboczy) i dirname(__FILE__) wróci bin (the dirname pliku wykonującego).

Powiązane problemy