Es más o menos habitual (y puede que una buena práctica) en nuestras aplicaciones desarrolladas con PHP definir alguna constante que contenga la ruta del directorio de nuestra aplicación, del directorio raíz, de manera, incluso, que podamos conformar más rutas partiendo de la primera. Pues bien, para conseguir esto puedes verte tentado de escribir algo así:
El código anterior estaría en un "script" que se encuentra justo en el directorio raíz de nuestra aplicación, así que partimos del mismo para conseguir el nombre del directorio en que se encuentra. No estoy seguro al cien por cien, pero, es probable que PHP defina como "directorio activo" al directorio del "script" en cuestión, de modo que, efectivamente, podríamos utiliza la anterior constante para nuestros propósitos. Sin embargo, existe una implementación mejor:
Estamos igual que antes, en el "script" en el directorio raíz de nuestra aplicación, pero, esta vez, no nos basaremos en el nombre del directorio, ni siquiera esperaremos a que PHP lo tome por el "directorio activo", sino que, usando la función "pathinfo", obtenemos, directamente, la ruta absoluta del directorio raíz de nuestra aplicación. La ruta absoluta, a la que podremos añadir "directorios" para conformar el resto de rutas de nuestra aplicación, por ejemplo:
define('GB_ADMIN_DIR', GB_ROOT_DIR_PATH . GB_ADMIN_DIR_NAME . DIRECTORY_SEPARATOR );
He pensado que igual podía resultar curioso a alguien, útil, en un momento dado. Pero, también es verdad que yo venía usando en mi proyecto Gesbit el primer "método", y ahora utilizo este segundo, y, lo refiero también porque me ha parecido una forma elegante (porqué no decirlo) de conseguir justo la información que realmente se necesita. Lo anterior no era correcto del todo, aunque funcionara, pero es que además PHP puede proporcionar lo que se precisa, ni más ni menos. Ahí queda eso. ;)
Publicada el Miércoles, 25/6/2008 por David Esperalta
Suscribirse a esta entrada - URL para Trackbacks
Hola David,
Ayer vi esta entrada y por más vueltas que le doy, no atino a ver la diferencia entre uno y otro método. Ambos se basan en la "constante" __FILE__ que siempre da la ruta absoluta del archivo, y ambos extraen la parte del directorio de esta ruta. ¿Qué se me está escapando?
Saludos
En realidad "dirname" te ofrece el nombre del directorio de "__FILE__", pero, ojo, el nombre del directorio y nada más. Sin embargo, "pathinfo" te ofrece la ruta completa del directorio, la ruta absoluta.
Vendría a ser como el "ExtractFileName" y "ExtractFilePath" de Delphi. El primero te ofrece el nombre del archivo, pero, el segundo te ofrece su ruta absoluta. Haciendo pruebas, esto es lo que he visto.
Pero también a mí se me puede estar escapando algo, y no sería la primera vez... Gracias por tus comentarios Román. ;)
Pondré un ejemplo de Windows, justamente, hablando de Gesbit, en el primer caso obtengo:
gesbit\
Que es el nombre del directorio en que se encuentra Gesbit, pero, en el segundo caso obtengo:
C:\localhost\gesbit\
La ruta absoluta del directorio "gesbit", no sólo su nombre. :)
Pues me dejas perplejo. En las pruebas que yo hago (PHP 5.2.x), si uso dirname(__FILE__) también me da la ruta completa., o sea, ambos métodos me dan lo mismo:
echo dirname(__FILE__);
echo pathinfo(__FILE__,PATHINFO_DIRNAME);
por ejemplo
/home/sistemas/fprof/htdocs en unix
C:\Documents and Settings\roman\Mis documentos\Trabajo\fprof\web\htdocs en windows
Saludos
Bueno, al ejemplo de windows le comieron las diagonales :) pero sí aparecen.
Pues así es Román, llevas razón... Yo supongo que me he decidido a usar "pathname" porque "dirname" no parecía la más apropiada... contando con "pathname", pero, reconozco públicamente que así es, "dirname" también retorna la ruta del directorio, no sólo su nombre, encontra de lo que dice el identificador de la función y en contra del manual de PHP, al menos de su traducción al español.
Yo supongo que habré hecho cien pruebas con "dirname", puesto que he cambiado a "pathname" porque me pareció más elegante, no me acordé de las pruebas, y he dicho que la función "dirname" sólo retorna el nombre de un directorio cuando no es así, efectivamente, como he comprobado ahora y tú mismo has comprobado.
Ahora estoy en la duda... ¿usar "dirname"? ¿usar "pathinfo"? Hum... ¿tú qué dices Román? :P
PD. Te he puesto las "barras" en el comentario: parece que hay que "escaparlas", no sé bien porqué ni porqué no... habrá que hablar con el gachó de Gesbit... :D
A ver, el manual, literalmente dice:
"Dada una cadena conteniendo el path a un fichero, esta función devolverá el nombre del directorio."
Si como "path" (¡vaya traducción!) ponemos "hola/mundo/esferico", dirname() -y también pathinfo()- devolverá "hola/mundo" como "nombre de directorio".
O sea, que -al parecer- ambas funciones trabajan sobre rutas no necesariamente existentes y no necesariamente absolutas, y lo que hacen simplemente es omitir la última diagonal y lo que le siga. Bueno eso es lo que me parece que hacen.
Así que, ¿cuál usar? Pues, como veo las cosas, da exactamente lo mismo :)
Saludos
Hasta donde yo llego también da igual qué usar, entonces. Igual "dirname", porque es más "corto"... y aunque me tenga que tragar mis palabras. :P No me importa. Al contrario. Creo que volveré usaré "dirname". Si es que, cuando algo funciona... ¡para qué tocarlo! ;)
Ea. Pues ya está. Muchas gracias Román por tus comentarios. :)