Base

Lorsqu'un programme devient plus complexe ou exploite du code développé par d'autres développeurs, le risque de conflits de noms de fonctions ou de variables augmente. Pour limiter et solutionner ces conflits, il est préférable de structurer la déclaration des fonctions et variables en ensembles cohérents appelés "espaces de noms".

Pour l'illustrer, considérons que nous avons récupéré deux librairies mathématiques; l'une dédiée à la manipulation d'entiers et l'autre de nombres à virgule flottante.

entier.php
<?php //entier.php
    namespace MesMaths\Entier;

    function ajout(int $a, int $b): int {
        return $a + $b;
    }
?>
flottant.php
<?php //flottant.php
    namespace MesMaths\Flottant;

    function ajout(float $a, float $b): float {
        return $a + $b;
    }
?>

Comme vous pouvez le constater, ces deux librairies déclarent une fonction homonyme "ajout".

Pour les besoins de notre programme, nous allons étendre les fonctionnalités de ces deux librairies en y ajoutant la constante PI et une fonction d'affichage. Afin de gérer les dépendances de fichiers, nous allons inclure les appels à entier.php et flottant.php. Ce qui nous donne :

<?php  //mesMaths.php
    namespace MesMaths;
    require_once 'entier.php';
    require_once 'flottant.php';

    const PI = 3.1415;

    function affiche($val) {
        echo "$val <br>";
    }
?>
Enfin, nous pouvons écrire notre programme. Nous allons lever les ambiguïtés de noms...

  • ...soit en spécifiant implicitement le nom de l'espace nom concerné (Flottant\ajout($a, $b)

  • ...soit en déclarant un alias (use function MesMaths\Entier\ajout as ajout;)

<?php //program.php
    namespace MesMaths;
    require_once 'mesMaths.php';

    use function MesMaths\Entier\ajout as ajout;
    use const MesMaths\PI as MON_PI;

    $a = 9.56;
    $b = 3.21;

    echo 'Entier: ', ajout($a, $b), '<br>';
    echo 'Flottant: ',Flottant\ajout($a, $b),'<br>';
    affiche(MON_PI);
?>

Dans notre programme, "MON_PI" est un alias "pointant" vers la constante "PI" de l'espace de noms "MesMaths". De même, "ajout" est un alias vers la fonction "alias" du sous espace de noms "Entier" de l'espace de noms "MesMaths".

Expérience

Dans l'exemple ci-dessus, "program.php" fait partie de l'espace de noms "MesMaths".

Quelle simplification pourriez-vous faire dans ce code en tenant compte de cette information ?

Soluce

L'indication "MesMaths" est inutile dans la création des alias:

<?php 
use function Entier\ajout as ajout;
use const PI as MON_PI;
En corollaire, déclarer un alias sur la constante PI est superflu.

Que faudrait-il changer si "program.php" ne fait plus partie de l'espace de noms "MesMaths" (suppression de la première instruction) ?

Soluce

<?php 
echo 'Flottant: ',MesMaths\Flottant\ajout($a, $b),'<br>';
MesMaths\affiche(MON_PI);