Maison >développement back-end >tutoriel php >Quelques réflexions sur les espaces de noms, une fonctionnalité clé de PHP ! ! !
Saviez-vous que les espaces de noms sont principalement utilisés pour résoudre le problème des éventuels conflits entre classes et fonctions dans le code ? Cette fonctionnalité est disponible dans d'autres langages depuis longtemps, mais PHP a tardé à arriver. Son émergence a donné naissance à PSR-4, qui a également donné naissance à Composer, c'est donc une fonctionnalité très importante.
Un espace de noms est un conteneur, qui est principalement utilisé pour identifier les classes et les fonctions qu'il contient. Une fois qu'un espace de noms est défini, le code en dessous appartient à cet espace de noms, la définition de l'espace de noms doit donc être au tout début du code.
Pour le même package, le code dans le même espace de noms ou sous-espace de noms n'a pas besoin d'être défini dans un fichier PHP. Le code dans le sous-espace de noms sert à terminer le travail d'un module spécifique. combiné, il devient un espace de noms complet du package.
Si le code que vous écrivez ne définit pas d'espace de noms, cela signifie qu'il appartient à l'espace de noms global (symbole), vous pouvez donc directement référencer des classes ou des fonctions (sans ajouter le symbole).
(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 nouvel 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 finalement référencé est ABC().
Illustrez les trois méthodes de référence à 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 :
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 , aussi 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
Si la hiérarchie des espaces de noms à utiliser est longue et nombreuse, elle sera particulièrement gênante à utiliser , vous pouvez donc utiliser le mot-clé use pour importer des espaces de noms, des classes, des constantes, des fonctions, etc., puis les utiliser pour référencer directement le nom complet. Le mot-clé alias peut renommer les classes et fonctions importées.
Par exemple, comment utiliser le mot-clé use, le 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é :
__init__.py
dans un module ou un package, l'analyseur Python importera automatiquement les fichiers du package ou tous les modules. 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.
Apprentissage recommandé : "Tutoriel vidéo PHP"
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!