Maison  >  Article  >  développement back-end  >  Explication détaillée des instances d'espace de noms PHP

Explication détaillée des instances d'espace de noms PHP

怪我咯
怪我咯original
2017-07-13 14:36:511658parcourir

PHP Namespace (namespace) a été ajouté dans PHP 5.3 Si vous avez appris C# et Java, alors l'espace de noms n'est rien de nouveau. Cependant, cela a toujours une importance très importante en PHP.

L'espace de noms PHP peut résoudre les deux types de problèmes suivants :

Conflits de noms entre le code écrit par l'utilisateur et les classes/fonctions/constantes internes PHP ou les classes/fonctions/constantes tierces.

Créer un nom alias (ou court) pour un nom d'identifiant très long (généralement défini pour atténuer le premier type de problème), améliorant ainsi la lisibilité du code source.

Définition des espaces de noms

Par défaut, tous les noms de constantes, de classes et de fonctions sont placés dans l'espace global, tout comme avant les espaces de noms pris en charge par PHP.

Un espace de noms est déclaré à l'aide du mot-clé namespace. Si un fichier contient un espace de noms, il doit déclarer l'espace de noms avant tout autre code.

Trois façons de référencer les identifiants d'espace de noms

(1) Le nom complet

est similaire à un chemin absolu sur le système d'exploitation, et il est le chemin complet, il n'y aura donc aucun malentendu lors de sa compréhension.

Par exemple, dans le nouveau ABC , alors C sera résolu en classe C sous l'espace de noms AB.

(2) Le nom qualifié

est similaire à un chemin relatif sur le système d'exploitation, il contient une partie du nom et est référencé à l'espace de noms actuel.

Par exemple, si BC() est appelé sous l'espace de noms A, l'espace de noms finalement référencé est ABC().

(3) Le nom non qualifié

est similaire au nom qualifié, mais n'inclut pas les sous-espaces de noms.

Par exemple, si C() est appelé sous l'espace de noms AB, l'espace de noms final référencé est ABC().

Illustrez les trois méthodes de citation à travers un exemple :

namespace \Example;
require_once "fnction.php";
class ClassA {}
function Function() {}
//完全限定名称
\Example\Function();
\Example\B\Function(); 
//限定名称
B\Function(); //指向 \Example\B\Function();
//非限定名称
$test = new ClassA(); //resolves to \Example\ClassA
Function(); //指向 \Example\Function

Remarque :

•Dans un espace de noms, si aucune définition de fonctions et de constantes n'est trouvée dans la portée actuelle, PHP ne signalera pas d'erreur. Recherchez-le plutôt dans l’espace de noms global.

•Dans un espace de noms, si aucune définition de classe n'est trouvée dans la portée actuelle, PHP signalera directement une erreur et n'ira pas dans la portée globale pour trouver la classe correspondante, donc si vous avez besoin de référencer une classe interne ou une classe définie par l'utilisateur, le nom complet doit être utilisé.

Pour donner un exemple simple, écrivez d'abord un morceau de code (défini dans l'espace de noms) et nommez-le function.php :

namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() 
{
  return "foo\r\n";
}
class foo 
{
  static function staticmethod()
  {
    return METHOD . "\r\n" ;
  }
  function foofunction()
  {
    return METHOD . "\r\n" ;
  }
}

Ensuite, écrivez un morceau de code test.php, également dans Code sous l'espace de noms :

namespace secondsp;
include 'function.php';
class foo
{
  function foofunction()
  {
    return METHOD . "\r\n" ;
  }
}
function is_file($file)
{
  return true ;
}
//非限定名称:实例化secondsp\foo类对象
$obj = new foo; 
echo $obj->foofunction();
//实例化Foo\Bar\subnamespace\foo 类对象
$obj = new Foo\Bar\subnamespace\foo ;
echo $obj->foofunction();
//代码会报错,在命名空间内部,假如无法找到当前命名空间下的类,则会报错
//$obj = new ArrayObject(array(1)); 
$obj = new \ArrayObject(array(1)); 
//在命名空间内部,假如无法找到当前命名空间下的函数或者常量,则会寻找 native function
echo strlen("nihao");
 //引用当前命名空间下的函数
var_dump(is_file('nihao')); //True
//引用全局函数
var_dump(\is_file('nihao')); //False

import, alias

Si le niveau d'espace de noms à utiliser est long et qu'il y en a beaucoup, alors soyez particulièrement prudent lorsque son utilisation pose problème, vous pouvez donc utiliser le mot-clé use pour importer des espaces de noms, des classes, des constantes, des fonctions, etc., qui peuvent ensuite être utilisés pour référencer directement les noms complets. Le mot-clé alias peut renommer les classes et fonctions importées.

Par exemple, comment utiliser le mot-clé use, ce code est sous l'espace de noms global :

include 'function.php';
use Foo\Bar\subnamespace\foo ;
$obj = new foo;
echo $obj->foofunction();
use Foo\Bar\subnamespace\foo as aliasfunname;
$obj = new aliasfunname;
echo $obj->foofunction();
use Foo\Bar\subnamespace ; 
$obj = new subnamespace\foo ;
echo $obj->foofunction();
use Foo\Bar\subnamespace as aliasname;
$obj = new aliasname\foo ;
echo $obj->foofunction();
//由于调用代码并不在命名空间内,所以对于全局的类,无需引入使用
$obj = new ArrayObject(array(1)); 
//导入一个函数
use function Foo\Bar\subnamespace\foo  ;
echo foo();
use function Foo\Bar\subnamespace\foo as func;
echo func();
use const Foo\Bar\subnamespace\FOO;
//echo FOO;

Résumé :

• et Python Différemment, l'espace de noms en PHP est un concept sémantique et n'a rien à voir avec l'emplacement et la disposition du code spécifique. En d'autres termes, le code qui utilise l'espace de noms doit importer lui-même les fichiers de la bibliothèque (tous les fichiers). comment les fichiers de la bibliothèque sont organisés Cela n'a pas d'importance ; en Python, s'il y a un fichier init.py dans un module ou un package, l'analyseur Python importera automatiquement les fichiers du package ou tous les modules.

•Le concept de portée en PHP est très faible, et le domaine global et le domaine local sont clairement distingués. Par exemple, les variables de l'espace global ne peuvent pas être référencées dans des fonctions ou des classes. La situation est différente dans les espaces de noms. Si le code qui définit l'espace de noms ne trouve pas les constantes et les fonctions dans l'espace de noms correspondant, il utilisera les constantes et les fonctions globales et s'il ne trouve pas la classe dans l'espace de noms correspondant (y compris sa propre classe Define ; ), le code signalera directement une erreur.

•Si vous utilisez l'espace de noms via le mot-clé use, vous n'avez pas besoin de l'importer via le nom complet (symbole), car PHP suppose déjà que l'espace de noms importé est un espace de noms pleinement qualifié.

•Les constantes, fonctions, classes, interfaces et autres espaces de noms peuvent être importés via le mot-clé use.

• L'espace de noms est une fonctionnalité du langage. Afin de poursuivre une utilisation plus efficace, il devrait y avoir une spécification d'utilisation et un mécanisme de chargement automatique. Il s'agit de la spécification PSR-4.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn