PHP 5.3 : __DIR__ : Constante indiquant le répertoire du fichier courant

22 octobre 2008php, php-5.3
 Cet article a été rédigé il y a plusieurs années et peut ne plus être tout à fait à jour…

Les exemples correspondant à ce point se trouvent dans le répertoire "DIR".

De manière générale, depuis des années, lorsque nous voulons inclure un fichier, nous avons pris l'habitude de travailler par rapport au répertoire au sein duquel nous nous trouvons.

Autrement dit, nous n'utilisons généralement pas une syntaxe de la forme suivante :

<?php
require_once('mon-fichier.php');

Mais plutôt quelque chose comme ceci :

<?php
require_once(dirname(__FILE__) . '/mon-fichier.php');

L'intérêt étant que cela rend nos inclusions plus portables : même si le fichier est lui-même inclus depuis un autre, nos inclusions continueront à fonctionner.

En effet, avec cette écriture, nos inclusions se font toujours par rapport à la racine du système de fichier. Par exemple, la portion de code suivante :

<?php
var_dump(dirname(__FILE__));

entrainera l'affichage suivant :

string '/home/php/php53/DIR' (length=19)

Cette approche souffre de deux inconvénients :

  • C'est long à écrire ; surtout lorsque l'on doit l'utiliser en de nombreux endroits dans notre code source, ce qui est souvent le cas[1].
  • Le chemin vers le répertoire du fichier est calculé à l'exécution de la portion de code ; ce qui est coûteux, en terme de performances.

Pour répondre à ce besoin, en évitant les problèmes posés par la solution à base de dirname, PHP 5.3 introduit une nouvelle constante magique : __DIR__.
Celle-ci vaut exactement la même chose que dirname(__FILE__), mais évite les deux problèmes soulevés plus haut :

  • Elle ne fait que quelques caractères : elle est donc plus rapide à saisir, et diminue le risque de fautes de frappe,
  • Et elle est calculée à la compilation du code, entrainant un gain au niveau des performances par rapport à la première version.

Au niveau de l'écriture, en PHP 5.3, vous pourrez maintenant utiliser ceci :

<?php
var_dump(__DIR__);

Et vous obtiendrez exactement la même sortie écran que précédemment, à savoir, de nouveau :

string '/home/php/php53/DIR' (length=19)

Vous noterez que comme avec dirname, le chemin obtenu vers le répertoire ne se termine pas par un séparateur de répertoires (/, typiquement) : c'est toujours à vous de l'ajouter si besoin est.