I agree with SR, the new namespaces feature has solved a number of problems for me which would have required horrible coding to solve otherwise.
An example use:
Say you are making a small script, and write a class to connect to a database, calling it 'connection'. If you find your script useful and gradually expand it into a large application, you may want to rename the class. Without namespaces, you have to change the name and every reference to it (say in inheriting objects), possibly creating a load of bugs. With namespaces you can drop the related classes into a namespace with one line of code, and less chance of errors.
This is by no means one of the biggest problems namespaces solve; I would suggest reading about their advantages before citicising them. They provide an elegant solutions to several problems involved in creating complex systems.
Définition de l'espace de noms
L'espace de noms est déclaré en utilisant le mot clé namespace, devant être au tout début du fichier. Par exemple :
Exemple #1 Définition de l'espace de noms
<?php
namespace MyProject::DB;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
Le nom d'un espace de noms peut être utilisé dans plusieurs fichiers.
L'espace de noms peut contenir des classes, des constantes et des fonctions, mais pas de code libre.
La définition de l'espace de noms a pour conséquence ce qui suit :
- Dans un espace de noms, tous les noms de classes, de fonctions, et de constantes, dans leurs définitions, sont automatiquement préfixés par le nom de l'espace de noms. Le nom de la classe est toujours le nom complet, i.e. dans l'exemple ci-dessus, la classe est appelée MyProject::DB::Connection.
- Les définitions de constantes créent les constantes, qui sont composées du nom de l'espace de noms et du nom de la constante. Comme les constantes de classe, les constantes de l'espace de noms ne peuvent contenir que des valeurs statiques.
-
Le nom de classe non-qualifié (i.e., nom ne contenant pas ::) est résolu au moment de l'exécution, en suivant cette procédure :
- La classe est recherchée dans l'espace de noms courant (i.e. en préfixant le nom avec le nom de l'espace de noms courant) sans tenter de la charger automatiquement.
- La classe est recherchée dans l'espace de noms globale, sans tenter de la charger automatiquement.
- Le chargement automatique pour le nom de l'espace de noms courant est tenté.
- Si la dernière tentative échoue, la recherche échoue.
-
Le nom de la fonction non-qualifié (i.e. nom ne contenant pas ::) est recherché au moment de l'exécution tout d'abord dans l'espace de noms courant, puis, dans l'espace global.
-
La constante non-qualifiée est recherché tout d'abord dans l'espace de noms courant, puis, dans les constantes globales.
Voir aussi les règles complètes de résolution de noms.
Définition de l'espace de noms
07-Sep-2008 05:56
14-May-2008 12:47
There is nothing wrong with PHP namespaces, except that those 2 instructions give a false impression of package management.
... while they just correspond to the "with()" instruction of Javascript.
By contrast, a package is a namespace for its members, but it offers more (like deployment facilities), and a compiler knows exactly what classes are in a package, and where to find them.
01-Apr-2008 12:11
@ RS: Also, you can specify how your __autoload() function looks for the files. That way another users namespace classes cannot overwrite yours unless they replace your file specifically.
