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 :

  1. __DIR__ → « Où se trouve mon fichier PHP ? »
  2. dirname(...) → « Remonte d'un répertoire. »
  3. $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.