PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Définition de l'espace de noms> <Late Static Bindings
Last updated: Fri, 20 Jun 2008

view this page in

Les espaces de noms

Sommaire

Les espaces de noms

Les espaces de noms, en PHP, ont été conçus pour résoudre un problème de portée de variables dans de grosses bibliothèques PHP. En PHP, toutes les définitions de classes sont globales. Ainsi, lorsqu'une bibliothèque crée divers utilitaires ou API de classes publiques, l'auteur doit être prudent sur le faire que d'autres bibliothèques avec les mêmes fonctionnalités peuvent exister et ainsi, choisir des noms uniques afin que les bibliothèques puissent être utilisées ensemble. Habituellement, l'on préfixe les noms des classes avec une chaîne unique, i.e. les classes des bases de données sont préfixées par Ma_Bibliotheque_DB, etc. Lorsque la bibliothèque grossit, les préfixes s'enchaînent et l'on atteint des noms très longs.

Les espaces de noms permettent aux développeurs de gérer les noms sans pour autant avoir des noms longs à chaque fois que la classe y réfère, et résout ainsi le partage des globales partagés sans rendre le code illisible.

Les espaces de noms sont disponibles en PHP depuis la version 5.3.0. Cette section est expérimentale et est susceptible de changer.



add a note add a note User Contributed Notes
Les espaces de noms
yarco dot w at gmail dot com
01-Jul-2008 10:19
So do you mean if i want to use a class, i need to do extra two steps?

1) require/include that file
2) use the namespace

What about to add a trigger something like:

function __auto_namespace($names, $class)
{
  if ($class === null)
  {
    set_include_dir(implode('/', $names));
  }
  else
  {
    require_once implode('/', $names).'/'.$class.'.php';
  }
}

Then when we:
use NAMESPACE1::NAMESPACE2;
or
use NAMESPACE1::NAMESPACE2::CLASS1;

php could auto include the file we needed.
Amir Abiri
26-Dec-2007 02:31
So, if I understand correctly there is a possible ambiguity that can cause a function or method to become "masked".

If I have:

global.php:
<?php
class A
{
    static public function
foo()
    {
    }
}

A::foo(); // Will statically call method foo() of class ::A.
?>

If I now added the following to my project:

A.php:
<?php
namespace A
;

function
foo()
{
}
?>

The function call above would instead call this new function.

It shouldn't be a problem most of the time and specially if certain basic practices are followed (For example, don't name classes and namespaces the same name, and always keep different packages in their own separate namespaces), but it's something to keep in mind.

Définition de l'espace de noms> <Late Static Bindings
Last updated: Fri, 20 Jun 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites