2010-02-02 8 views
21

En PHP ¿cuál es la diferencia entreDiferencia entre getcwd() y dirname (__ FILE__)? ¿Qué debería usar?

getcwd() 
dirname(__FILE__) 

Ambos devuelven el mismo resultado cuando me hago eco de la CLI

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

Devuelve:

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

¿Cuál es el mejor para usar ? ¿Importa? ¿Qué prefieren los desarrolladores de PHP más avanzados?

+0

No olvide que 'dirname (__ FILE __)' es lo mismo que '__DIR__' –

Respuesta

46

__FILE__ es un magic constant que contiene la ruta completa al archivo que está ejecutando. Si se encuentra dentro de una inclusión, su ruta será el contenido de __FILE__.

Así que con esta configuración:

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

Obtiene esta salida:

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

Así getcwd() devuelve el directorio donde se inició la ejecución, mientras que es dirname(__FILE__) archivo dependiente.

En mi servidor web, getcwd() devuelve la ubicación del archivo que originalmente comenzó a ejecutarse. El uso de la CLI es igual a lo que obtendría si ejecutara pwd.Esto es apoyado por el documentation of the CLI SAPI y un comentario sobre la getcwd página del manual:.

la CLI SAPI - al contrario de otros SAPIs - no cambia automáticamente el directorio de trabajo actual a la que el guión comenzado reside en

Así como:

[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 

por supuesto, consulta el manual en http://php.net/manual/en/function.getcwd.php

ACTUALIZACIÓN: Desde PHP 5.3.0 también puede usar la constante mágica __DIR__ que es equivalente a dirname(__FILE__).

+2

¡El ejemplo perfecto es perfecto! ¡Gracias! – Urda

+0

¿Existe una manera rápida de obtener el directorio del script principal del script incluido? Entonces, dentro de un script incluido que estará en un directorio diferente, quiero saber el directorio del script principal que lo incluye. – CMCDragonkai

+0

@CMCDragonkai: No sé si hay una forma mejor, pero podrías intentar establecer una constante en el archivo principal con el valor de '__DIR__'. –

1

Pruebe esto.

Mueva su archivo a otro directorio, por ejemplo testing2.

Esto debería ser el resultado.

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

yo creo getcwd se utiliza para operaciones de archivo, donde dirname(__FILE__) utiliza la constante mágica __FILE__ y utiliza la ruta del archivo real.


Editar: Estaba equivocado.

Bueno, puede cambiar el directorio de trabajo, con chdir.

Así que si usted hace eso ...

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

Estos deberían ser diferentes.

+0

No, esta vez solo echos/home/user/Desktop/testing/testing2 dos veces – Urda

+0

OK, así que déjenme asegurarme de tener esto ... dirname (__ FILE__) * siempre * producirá la ubicación del archivo en uso. Mientras getcwd devolverá el directorio de trabajo actual para el proceso de PHP en ejecución (como mi script de línea de comandos) Suponiendo esto, si uso un include ("ruta/a/algunos/archivo/desde/chdir /"); debería ser capaz de encontrar el archivo al que se hace referencia? – Urda

1

Si llama al archivo desde la línea de comandos, la diferencia es clara.

cd foo 
php bin/test.php 

dentro prueba.php, getcwd() volvería foo (el directorio de trabajo actual) y dirname(__FILE__) volvería bin (el nombredir del archivo de ejecución).

Cuestiones relacionadas