Comprendre $root = dirname(__DIR__); en PHP
Cette instruction paraît compliquée parce qu'elle contient deux éléments PHP imbriqués :
$root = dirname(__DIR__);
Pour la comprendre, il faut la lire de l'intérieur vers l'extérieur.
1. __DIR__
__DIR__ est une constante magique de PHP.
Elle contient le chemin absolu du répertoire dans lequel se trouve le fichier PHP qui contient cette instruction.
Par exemple, si le fichier est :
/var/www/estagel/diagnostic.php
alors :
echo __DIR__;
donne :
/var/www/estagel
Donc :
__DIR__
signifie simplement :
« Dans quel répertoire se trouve actuellement ce fichier PHP ? »
2. dirname()
dirname() est une fonction PHP qui permet de remonter au répertoire parent d'un chemin.
Par exemple :
dirname('/var/www/estagel');
donne :
/var/www
On peut donc considérer :
dirname(...)
comme :
« Donne-moi le répertoire qui contient celui que je viens de te donner. »
3. Les deux ensemble
Prenons :
$root = dirname(__DIR__);
Il faut commencer par l'intérieur :
__DIR__
Supposons que le fichier soit ici :
/var/www/estagel/admin/diagnostic.php
Alors :
__DIR__
vaut :
/var/www/estagel/admin
Ensuite PHP applique :
dirname('/var/www/estagel/admin')
Le résultat est :
/var/www/estagel
Et finalement :
$root = dirname(__DIR__);
met dans $root :
/var/www/estagel
Autrement dit :
__DIR__
↓
répertoire du fichier PHP
↓
/var/www/estagel/admin
dirname(__DIR__)
↓
répertoire parent
↓
/var/www/estagel
4. Pourquoi cela était nécessaire pour ton ancien diagnostic.php
Avant son déplacement, ton fichier était dans une structure de ce type :
/var/www/estagel/
├── pages/
├── cache/
├── theme/
└── admin/
└── diagnostic.php
Le fichier diagnostic.php était dans :
/var/www/estagel/admin
Donc :
__DIR__
donnait :
/var/www/estagel/admin
Mais le programme devait accéder aux répertoires :
/var/www/estagel/pages
/var/www/estagel/cache
/var/www/estagel/theme
Il fallait donc remonter d'un niveau :
dirname(__DIR__)
ce qui donnait :
/var/www/estagel
C'est pourquoi on avait :
$root = dirname(__DIR__);
5. Maintenant que diagnostic.php est à la racine
Tu as déplacé le fichier ici :
/var/www/estagel/diagnostic.php
Il n'y a plus de répertoire admin entre le fichier et la racine.
Donc :
__DIR__
donne directement :
/var/www/estagel
Il n'y a donc plus aucune raison d'utiliser dirname().
La bonne instruction est :
$root = __DIR__;
6. Comparaison
Ancienne position
/var/www/estagel/
│
├── pages/
├── cache/
├── theme/
│
└── admin/
└── diagnostic.php
Avec :
__DIR__
on obtient :
/var/www/estagel/admin
Avec :
dirname(__DIR__)
on obtient :
/var/www/estagel
Donc :
$root = dirname(__DIR__);
était correct.
Nouvelle position
/var/www/estagel/
│
├── pages/
├── cache/
├── theme/
│
└── diagnostic.php
Avec :
__DIR__
on obtient directement :
/var/www/estagel
Donc :
$root = __DIR__;
est maintenant correct.
7. Pourquoi utiliser $root ?
L'intérêt est de ne pas avoir à répéter le chemin physique du site partout dans le programme.
On définit une seule fois :
$root = __DIR__;
Puis on peut écrire :
$root . '/pages'
$root . '/cache'
$root . '/theme'
$root . '/medias'
Par exemple :
is_dir($root . '/pages')
Si $root vaut :
/var/www/estagel
PHP vérifie réellement :
/var/www/estagel/pages
8. Pourquoi ne pas écrire directement le chemin du serveur ?
On pourrait écrire :
$root = '/var/www/estagel';
Mais ce serait beaucoup moins pratique.
Sur ton téléphone, le chemin peut être par exemple :
/storage/emulated/0/@www/cms-universel
Sur ton hébergement OVH, le chemin physique peut être complètement différent.
Avec :
$root = __DIR__;
PHP détermine automatiquement le chemin correspondant à l'endroit où se trouve le fichier.
Le programme est donc beaucoup plus facilement transférable d'un environnement à un autre.
9. Attention : chemin physique et URL sont deux choses différentes
C'est une distinction très importante.
L'adresse dans le navigateur peut être :
https://estagel.ovh/diagnostic.php
Mais le fichier peut physiquement se trouver sur le serveur dans quelque chose comme :
/home/moncompte/www/diagnostic.php
Donc :
__DIR__
peut donner :
/home/moncompte/www
Il ne donne pas :
https://estagel.ovh
__DIR__ concerne le système de fichiers du serveur, pas l'adresse URL.
10. Que se passe-t-il si le fichier est plus profondément placé ?
Supposons cette organisation :
/var/www/estagel/
├── pages/
│
└── admin/
└── outils/
└── diagnostic.php
Dans diagnostic.php :
__DIR__
donne :
/var/www/estagel/admin/outils
Pour remonter d'un niveau :
dirname(__DIR__)
donne :
/var/www/estagel/admin
Pour remonter de deux niveaux :
dirname(dirname(__DIR__))
donne :
/var/www/estagel
On peut le visualiser ainsi :
__DIR__
↓
/var/www/estagel/admin/outils
dirname(__DIR__)
↓
/var/www/estagel/admin
dirname(dirname(__DIR__))
↓
/var/www/estagel
11. Une autre façon d'écrire dirname()
PHP permet également de préciser directement le nombre de niveaux à remonter :
dirname(__DIR__, 2);
Cela signifie :
« Remonte de deux niveaux à partir de
__DIR__. »
Ainsi :
dirname(__DIR__, 1)
équivaut à :
dirname(__DIR__)
Et :
dirname(__DIR__, 2)
équivaut à :
dirname(dirname(__DIR__))
12. La règle à retenir
Il suffit finalement de retenir ceci :
__DIR__
↓
le répertoire dans lequel se trouve le fichier PHP
dirname(__DIR__)
↓
le répertoire parent du fichier PHP
dirname(__DIR__, 2)
↓
deux niveaux au-dessus du fichier PHP
Dans ton cas actuel :
racine du site
│
├── pages/
├── cache/
├── theme/
└── diagnostic.php
```
`diagnostic.php` est **déjà dans la racine**.
Donc :
~~~php
__DIR__
désigne directement la racine.
Il faut donc utiliser :
$root = __DIR__;
et non :
$root = dirname(__DIR__);
En résumé
$root = dirname(__DIR__);
se lit ainsi :
__DIR__→ « Où se trouve mon fichier PHP ? »dirname(...)→ « Remonte d'un répertoire. »$root =→ « Mets ce résultat dans la variable$root. »
Donc, si le fichier est :
/var/www/estagel/admin/diagnostic.php
alors :
$root = dirname(__DIR__);
donne :
$root = /var/www/estagel
Mais si le fichier est directement :
/var/www/estagel/diagnostic.php
alors :
$root = __DIR__;
donne déjà :
$root = /var/www/estagel
C'est exactement pour cette raison que nous avons remplacé dirname(__DIR__) par __DIR__ lorsque tu as déplacé diagnostic.php à la racine.