WEB-d Développement Web

PHP, SQL, HTML5, CSS3, Javascript, Mootools, Référencement, SEO, CMS, e-commerce, Apache, Linux, Ubuntu, ...

Aide-mémoire : Les espaces de noms PHP

Les espaces de noms, arrivés avec PHP 5.3, sont grosso-modo l'équivalent des packages de Java.

Définition d'un espace de noms

Un espace de noms a pour but de contenir des classes, des interfaces, des fonctions et des constantes. Voici par exemple le fichier dframework.php:


// La déclaration du namespace doit être la première ligne du fichier
// Les tirets sont interdits
namespace web_d\dframework;

class MaClasse {}

// Il est possible de redéfinir une fonction PHP
function strlen($string) {
    return 0;
}

const MACONSTANTE = 1;

// L'espace de noms peut également contenir d'autres instructions,
// mais à priori ce n'est pas le but
echo "Hello";
 

Utilisation

L'utilisation de cet espace de noms est possible depuis l'espace de noms "global", lorsqu'aucun namespace n'est indiqué, comme ci-dessous:


require_once "./dframework.php";

$a = new \web_d\dframework\MaClasse;
 

Importation

Pour éviter de chaque fois indiquer le nom complet de la classe, fonction ou constante, on peut importer un espace de noms:


// Contrairement à Java, ceci est impossible:
// use web_d\dframework\*
// $b = new MaClasse

// Il faut soit préciser le nom de l'espace de noms:
use \web_d\dframework;
$b = new dframework\MaClasse;

// Ou alors importer chaque classe ou fonction une par une
use \web_d\dframework\MaClasse;
$c = new MaClasse;

// En cas d'import, c'est d'abord la fonction globale qui est utilisée.
use \web_d\dframework\strlen;
echo strlen('bonjour'); // 7

// En cas de conflit, on peut créer un alias, mais ceci ne fonctionne que pour
// les classes, les interfaces, ou un espace de noms en entier:
use web_d\dframework\MaClasse as MaClasse2;
new MaClasse2;
 

A l'intérieur du même espace de noms


// Une autre façon de définir l'espace de noms
namespace web_d\dframework {
   
    // A l'intérieur du même espace de noms,
    // c'est d'abord la définition locale qui est utilisée
    echo strlen("bonjour"); // 0
   
    // Pour utiliser quand même la fonction globale:
    echo \strlen("bonjour"); // 7
   
    // Idem pour les classes et les constantes:
    $c = new \Exception('error');
   
    // namespace indique de chercher dans l'espace de nom local
    // les 2 instrcutions sont donc équivalentes
    $d = \web_d\dframework\MACONSTANTE;
    $d = namespace\MACONSTANTE;

    // Ceci n'est pas correct!
    //echo namespace;
   
    // Pour obtenir le nom de l'espace de nom sous forme d'un texte,
    // il existe la constante __NAMESPACE__
}
 

Langage dynamique


namespace web_d\dframework {

    // PHP étant un langage dynamique, il est possible de définir le
    // nom de classe, fonction ou constante à l'exécution:
    $class_name = __NAMESPACE__ . '\MaClasse';
    $e = new $class_name;
   
    $const_name = __NAMESPACE__ . '\MACONSTANTE';
    echo constant($const_name);
}
 

Articles similaires