2010-02-02 5 views
21

En PHP Quelle est la différence entreDifférence entre getcwd() et dirname (__ FILE__)? Lequel dois-je utiliser?

getcwd() 
dirname(__FILE__) 

Ils ont tous deux le même résultat quand je fais l'écho de CLI

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

Retours:

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

Quel est le meilleur à utiliser ? Est-ce que ça importe? Qu'est-ce que les développeurs PHP les plus avancés préfèrent?

+0

N'oubliez pas que 'dirname (__ FILE __)' est identique à '__DIR__' –

Répondre

46

__FILE__ est un magic constant contenant le chemin complet vers le fichier que vous exécutez. Si vous êtes dans un include, son chemin sera le contenu de __FILE__.

Donc, avec cette configuration:

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

Vous obtenez cette sortie:

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

Alors getcwd() retourne le répertoire où vous avez commencé l'exécution, alors que dirname(__FILE__) est dépendant du fichier.

Sur mon serveur web, getcwd() retourne l'emplacement du fichier qui a commencé à l'origine d'exécution. En utilisant le CLI, il est égal à ce que vous obtiendriez si vous exécutez pwd.Ceci est soutenu par le documentation of the CLI SAPI et un commentaire sur la page de manuel getcwd:.

le CLI SAPI ne - contrairement à d'autres SAPI - change pas automatiquement le répertoire de travail courant à celui du script commencé réside dans

donc, comme:

[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 

Bien sûr, vous pouvez aussi consulter le manuel à http://php.net/manual/en/function.getcwd.php

MISE À JOUR: Depuis PHP 5.3.0, vous pouvez également utiliser la constante magique __DIR__ qui est équivalente à dirname(__FILE__).

+2

L'exemple parfait est parfait! Je vous remercie! – Urda

+0

Existe-t-il un moyen rapide d'obtenir le répertoire du script principal à partir du script inclus. Donc, à l'intérieur d'un script inclus qui sera dans un répertoire différent, je veux connaître le répertoire du script principal qui l'inclut. – CMCDragonkai

+0

@CMCDragonkai: Je ne sais pas s'il existe un meilleur moyen, mais vous pouvez essayer de définir une constante dans le fichier principal à la valeur de '__DIR__'. –

1

essayer.

Déplacez votre fichier dans un autre répertoire dire testing2.

Cela devrait être le résultat.

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

Je pense getcwd est utilisé pour les opérations de fichiers, où dirname(__FILE__) utilise la magie __FILE__ constante et utilise le chemin de fichier réel.


Modifier: J'avais tort.

Eh bien, vous pouvez changer le répertoire de travail, avec chdir.

Donc, si vous faites cela ...

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

Celles-ci devraient être différentes.

+0

Non, cette fois il suffit d'echos/home/utilisateur/Desktop/testing/testing2 deux fois – Urda

+0

OK, alors laissez-moi être sûr ... dirname (__ FILE__) produira * toujours * l'emplacement du fichier utilisé. Alors que getcwd retournera le répertoire de travail courant pour le processus PHP en cours d'exécution (comme mon script en ligne de commande). Donc, supposons que ceci, si j'utilise un include ("path/to/un/file/from/chdir /"); il devrait être capable de trouver le fichier référencé? – Urda

1

Si vous appelez le fichier à partir de la ligne de commande, la différence est claire.

cd foo 
php bin/test.php 

au sein test.php, getcwd() retourneraient foo (répertoire de travail en cours) et dirname(__FILE__) retournerait bin (le dirname du fichier d'exécution).

Questions connexes