PHP NameSpace - comment le préparer ? Explication des espaces de noms PHP, tests et conception multiple

Une variable définit une valeur, mais peut être une référence à une autre variable et avoir sa valeur. Lors de l’exécution d’un algorithme, une variable prend généralement de nombreuses valeurs différentes. Une constante ne stocke qu’une seule valeur. Un objet est imprévisible : il a tendance à avoir une structure, un contenu et de nombreuses fonctionnalités.

Un espace de noms est une collection de variables, constantes, objets, fonctions et autres constructions créées par le développeur qui peuvent être référencées via le nom de cet espace de noms.

Noms : la sphère de description des données et des algorithmes

Les noms des éléments (variables, constantes, objets, fonctions et autres constructions du développeur) ne se croisent jamais. PHP interprète toute correspondance de nom comme une erreur grave, et dans les cas où il ne peut pas identifier clairement le problème, le développeur reçoit du code qui ne fonctionne pas comme prévu, ou une case blanche dans le navigateur.

Tous les noms de toutes les données doivent être uniques car l'espace est global. Les noms des objets et des fonctions ne doivent pas non plus être répétés, mais la portée de la visibilité globale est interrompue dans les corps de méthode des objets et des fonctions. Il possède son propre espace de noms local et rien ne vous empêche de nommer quelque chose en interne de la même manière qu'il est désigné en externe.

L’exemple ci-dessus est un classique, si vous n’y prêtez pas attention mot-clé espace de noms : tout, comme toujours. Les seconds comprennent des œuvres. Le préfixe NameSpaceTwo\ avant les noms de fonctions spécifie de quel insert le code est extrait.

Si l'on supprime le mot-clé global et l'opération de la première fonction $iExt = 1; passez à la ligne ci-dessus, alors ni la première ni la deuxième fonction ne connaîtront la valeur de la variable 100.

Espaces de noms : plusieurs étendues de description

Dans l'exemple présenté, il y a fichier partagé, qui utilise deux inserts. Chaque insert a la même fonction scCheckName(). Le programmeur décide lequel choisir en utilisant le nom de l'espace pertinent au bon moment et au bon endroit dans le code.

Le fait que le même nom soit présent dans le code commun (après fusion des insertions) ne provoque pas d'erreur pour la simple raison que chaque fichier d'insertion est marqué de son propre nom unique.

Dans le premier fichier, tout ce qui y sera décrit est associé au nom NameSpaceOne. Dans le deuxième fichier, toutes les descriptions seront associées au nom NameSpaceTwo.

Toute duplication de noms dans les deux fichiers est autorisée, mais dans chacun d'eux, tout nom d'élément (variable, constante, objet, fonction) doit être unique.

Dans cet exemple, la modification du nom de l'espace de noms dans l'appel de fonction scCheckName() a empêché la modification de la variable $iExt du deuxième espace de noms. C'est pourquoi dans l'exemple le mot « modifié » est spécialement mis en évidence : le changement n'a pas réellement eu lieu. La valeur de la variable reste la même.

Tests et conception multiple

Ces exemples simples montrent que vous pouvez facilement simplifier le développement de projets complexes, augmenter l'efficacité, la productivité et accélérer le travail. Décidément, les premières idées d'utilisation des espaces de noms sont immédiatement apparues :

  • tester en toute sécurité les scripts - en remplaçant les espaces « de travail » par des analogues de test ;
  • conception sécurisée par de grandes équipes de développeurs - en leur fournissant des espaces « individuels » pour décrire les éléments.

En fait, l’espace de noms est bien plus important. Langage PHP, l'espace de noms et chaque élément de la description (variable, constante, objet...) donnent depuis longtemps au développeur la possibilité de manipuler indépendamment la syntaxe et la sémantique.

Constructions du langage et règle générale de la programmation moderne : "compris" - exécuté - il y a une contradiction - " écran blanc"ne s'applique pas à un développeur professionnel."

De nombreux programmeurs ne savent même pas où chercher un message d’erreur PHP lorsqu’il n’y a rien dans le navigateur (une case blanche vide). A un certain stade de son développement, un programmeur pense en syntaxe et sémantique PHP, « travaille » automatiquement et le résultat : sa propre syntaxe et sa propre sémantique, dans la limite de ce qui est permis.

Un écran blanc est une réaction immédiate et sans ambiguïté d'un programmeur professionnel et l'erreur est éliminée. Pourquoi perdre du temps sur un débogueur et consulter le journal des erreurs ?

Objets, tableaux et espaces de noms

On pourrait dire que les variables, les constantes et les fonctions appartiennent au passé, mais elles sont utilisées dans la conception d'objets. Un bon code, c'est lorsque l'algorithme est représenté par des objets en interaction, et non par une séquence de constructions correctes.

Si vous utilisez des tableaux d'objets, manipulez l'idée d'une pile et le dernier (premier) élément du tableau, vous pouvez obtenir une dynamique : les objets eux-mêmes « décident » comment la fonctionnalité du site doit fonctionner en fonction de la situation actuelle. .

En PHP, un espace de noms est un type particulier de variable, représenté par son propre nom unique, souvent complexe. Le nom de l'espace de noms est utilisé dans le code. S'il s'agit d'une chaîne, vous pouvez remplacer un espace par un autre lors de l'exécution du script.

Si PHP utilise des noms d'espaces de noms comme valeurs de variables, il s'agit alors d'une syntaxe encore plus chargée sémantiquement, encore plus puissante que les tableaux d'objets.

Un objet est une structure et un contenu caractérisés par l'unité. Un espace de noms est un ensemble d'objets, d'éléments et de relations entre eux.

Il n'est pas possible de mener des expériences sur un système en cours d'exécution, mais grâce à l'espace de noms, PHP offre la possibilité de simuler un système réel en cours d'exécution dans un espace différent dans le but de :

  • développement ultérieur;
  • essai;
  • entretien etc.

Si l'on fait abstraction de la syntaxe proposée Développeurs PHP, et imaginez les espaces de noms comme des systèmes globaux complexes d'objets, alors les horizons des possibilités s'élargissent plusieurs fois.

Syntaxe et utilisation de l'espace de noms

PHP n'accepte que le mot espace de noms dans la première ligne de code de chaque fichier. Toutes les descriptions doivent uniquement le suivre. La syntaxe inclut uniquement le nom indiqué dans le sens habituel du nom.

Il est important d’utiliser les mots corrects qui transmettent le sens. C'est mieux quand le nom est long, mais il contient quelque chose qui donne une compréhension claire de quel espace nous parlons, de ce qu'il fait, de ce qu'il décrit, de ce qu'il accepte ou de ce pour quoi il a été créé.

Les espaces peuvent être imbriqués indéfiniment, mais il ne faut pas en abuser. Le nom doit être clair, l'imbrication doit être justifiée et la séquence de noms d'espace doit avoir une logique.

Dans les applications d'utilisation et d'espace de noms, PHP permet un codage complexe, mais dans la mesure du possible, il est préférable d'opter pour l'option simple.

Règle générale: espace de noms - description et ceci est un fichier, use - il s'agit d'importer l'espace dans le script d'utilisation et de lui attribuer un alias (lien court).

Un exemple simple de classes à chargement automatique (objets)

La tâche contient un objet permettant de manipuler des chaînes, des styles d'éléments de page (descriptions CSS), un objet date, système de fichiers et bases de données. Le point de mise en œuvre est de créer selon ces cinq positions interfaces simples dans le but d'utiliser les opportunités nécessaires uniquement à travers les méthodes de ces objets.

Aucune utilisation directe des fonctions et constructions du langage n’est autorisée. Cette tâche utilise le chargement automatique de la classe PHP. L'espace de noms est considéré comme une collection d'objets situés à un emplacement spécifique du système de fichiers. Généralement, tous les objets se trouvent dans le système de fichiers selon leur signification, dans des dossiers et dans des fichiers portant un nom spécifique.

Le code de gauche indique la création des cinq objets requis, mais leur emplacement exact n'est pas indiqué. Le code de droite montre le texte de l'autochargeur (script principal), qui, lors du chargement des classes (objets), substitue automatiquement le chemin requis vers l'emplacement de l'objet et l'extension de fichier .php.

Exemple de plusieurs espaces de noms

La bibliothèque PhpOffice/PhpWord est un bon exemple d'utilisation d'une hiérarchie complexe de plusieurs espaces de noms. Le dossier éléments contient la quasi-totalité des éléments disponibles lors de la création d'un document *.docx (MS Word), d'autres dossiers contiennent les outils nécessaires pour travailler avec des éléments, des paragraphes et des tableaux.

En fait, la bibliothèque a été placée dans le dossier du projet car l'espace de fonctionnalités PhpOffice / PhpWord devait être complété par des outils spécifiques et finalement créer votre propre version d'un produit similaire.

Chargement de nombreuses classes d'espaces de noms différents

Utiliser PHP Le chargement automatique de l'espace de noms, lorsqu'il est nécessaire de charger de nombreuses classes et que la hiérarchie du système d'objets développé est assez complexe et difficile à représenter, conduit à la nécessité de créer des structures rigides.

L'orientation du développeur (qui utilise le produit pour continuer son travail) n'est possible que dans le contexte de la sémantique (compréhension du projet), qui est représentée par des combinaisons appropriées de mots reflétant le sens réel et les relations des objets.

La nécessité d'utiliser la bibliothèque dans un projet individuel conduit à résoudre le problème de la combinaison des espaces de noms du développeur et de l'auteur PhpOffice/PhpWord. La meilleure façon est de placer ce produit (ses espaces et objets) dans son propre espace de projet.

Il est important de noter qu'il ne sera pas possible de se passer de modifier les espaces de noms de ce produit au niveau de ses éléments abstraits et du chargement des classes. Cela indique que dans l'espace de noms PHP, l'utilisation d'espaces de noms internes n'est peut-être pas suffisamment abstraite et universelle.

Système de fichiers et localisation des espaces

Essentiellement, les espaces de noms sont le « tracé » du chemin dans le système de fichiers vers l'objet souhaité. Utiliser des noms de fichiers comme noms d’objets est naturel et courant. L'utilisation de noms de dossiers comme dénomination d'espace de noms est objective.

L'organisation « en bois » de l'information est assez lourde à utiliser et complique le développement, mais c'est une représentation naturelle des systèmes d'objets.

Le problème est que la phase de développement est représentée par un éditeur de code spécifique, qui combine à la fois la représentation visible des dossiers et le contenu d'un dossier spécifique, mais il n'existe pas encore d'éditeur qui permettrait un mouvement de bout en bout à travers les objets et à travers dossiers.

Le problème de l’abstraction et de l’universalité

Accepté par la conscience du développeur et objectif en réalité :

  • fournit l'abstraction et la capacité de manipuler l'information selon sa véritable sémantique ;
  • les espaces de noms reflètent la position des scripts, des objets et en partie la signification du projet dans le système de fichiers

En fait, en connectant l'abstraction POO aux noms d'objets (fichiers) et en la superposant sur le système de fichiers (dossiers) avec une formation d'espace de noms adéquate (chemins + noms), vous pouvez contrôler la formation des espaces de noms lors de l'exécution du script.

La programmation a déjà acquis une puissante dynamique de développement, mais si nous transférons le processus et la charge de l'étape de développement de éditeur de texte(dans lequel des scripts sont créés et placés le long d'arborescences de dossiers) sur l'idée de générer un tel code qui puisse être amélioré et placé au bon endroit dans le système de fichiers - la programmation atteindra de nouveaux sommets.

J'ai récemment encapsulé mon projet dans un espace de noms et j'ai rencontré le problème du manque de documentation appropriée. Tout ce qui a été trouvé remonte à environ 2009, et nous sommes presque à 2012... Dans le matériel trouvé, il y a beaucoup d'endroits non fonctionnels qui utilisent ce qui se trouve dans le courant. version php Non. À cet égard, je voudrais faire la lumière sur cette question.
Alors, qu’est-ce qu’un espace de noms ou espace de noms ? Le grand Wikipédia les définit ainsi :

L'espace de noms est un ensemble, c'est-à-dire un modèle, un stockage abstrait ou un environnement créé pour le regroupement logique d'identifiants uniques (c'est-à-dire des noms). Un identifiant défini dans un espace de noms est associé à cet espace de noms. Le même identifiant peut être défini indépendamment dans plusieurs espaces. Ainsi, une valeur associée à un identifiant défini dans un espace de noms peut (ou non) avoir la même signification (ou plutôt différente) que le même identifiant défini dans un autre espace de noms. Les langages prenant en charge les espaces de noms définissent des règles qui indiquent à quel espace de noms appartient un identifiant (c'est-à-dire sa définition).wiki

Est-ce que tout est clair ? C'est en fait simple. Avant la version 5.3, il n'y avait que deux espaces en php - global (dans lequel votre code principal était exécuté) et local (dans lequel les variables de fonction étaient définies).

Depuis la version 5.3 tout a changé. Vous pouvez maintenant définir votre espace de noms dans lequel vos classes, méthodes, etc. existeront.


J'espère que c'est devenu un peu plus clair.

J'ai spécifiquement nommé les classes de la même manière. Puisqu’ils sont définis dans des espaces différents, ce sont deux classes différentes, malgré les mêmes noms. Le script principal fonctionne toujours dans l'espace global, rien n'a changé ici et des classes et fonctions peuvent toujours y être définies. Alors à quoi servent les espaces ? Tout d'abord, pour vous assurer que lorsque vous incluez un fichier dans un framework ou une bibliothèque, vos classes ne remplaceront pas les classes du framework ou vice versa.

Afin d'utiliser les classes définies dans votre espace de noms, vous devez importer l'espace que vous définissez dans l'espace global au bon endroit (je préfère généralement le faire au début du fichier. Pour ce faire, utilisez le mot-clé use).

Attention: pour une raison quelconque, php n'autorise pas l'utilisation du mot-clé utiliser en état de blocs et de boucles

Prenons l'exemple des images et implémentons-le dans le code :

Attention: le mot-clé namespace doit être situé au tout début du fichier, immédiatement après
fichier A.php
Fichier B.php
Une syntaxe alternative est possible :
Il est recommandé de déclarer chaque espace de noms dans un fichier distinct. Bien que cela soit possible en un seul, ce n’est strictement pas recommandé !
Passons maintenant au troisième fichier, dans lequel fonctionnera notre script principal
index.php
Il semblerait que ce soit un avantage, seulement plus de code est ajouté, mais ce n'est pas tout à fait vrai, un peu plus loin je donnerai un exemple de classe de chargement automatique, avec laquelle les lignes reliant les fichiers aux classes seront inutiles.
Regardons maintenant nos cours.

Attention: en utilisant l'opérateur de résolution de portée (::) dans les espaces de noms php non autorisé! La seule chose pour laquelle il convient est d’accéder aux méthodes et constantes de classe statique. Au début, ils voulaient l'utiliser pour l'espace de noms, mais ils ont ensuite décidé de ne pas le faire en raison de problèmes survenus. Par conséquent, une construction comme A::A::say(); n'est pas valide et entraînera une erreur.

Pour les espaces de noms, vous devez utiliser le caractère barre oblique inverse "\"
Attention: Pour éviter tout malentendu, il est nécessaire d'échapper ce caractère lorsqu'il est utilisé dans des chaînes : "\\"

Les espaces de noms peuvent être imbriqués les uns dans les autres, ajoutons à notre fichier A.php :
et dans l'index nous écrirons ce qui suit :

Un point important est d'utiliser des alias pour les espaces importés. Vous pourriez écrire A\subA::say(); Vous conviendrez qu'il est difficile d'écrire des chemins complets vers des espaces à chaque fois ; pour éviter cela, des alias ont été introduits. Lors de la compilation, ce qui suit se produira : au lieu de l'alias sub, A\subA sera remplacé, nous obtiendrons donc l'appel A\subA::say();

Que se passe-t-il alors lors de l’appel de fonctions définies dans l’espace global ? PHP recherche d'abord une fonction dans l'espace dans lequel vous travaillez actuellement, et s'il ne la trouve pas, il passe à la portée globale. Afin d'indiquer immédiatement que vous utilisez une fonction globale, vous devez la faire précéder d'une barre oblique inverse.

Afin d'éviter les problèmes de chargement automatique des classes à partir des espaces, le système de fichiers doit être organisé de la même manière que l'organisation des espaces. Par exemple, nous avons un dossier racine classes, où nos classes seront stockées, alors nos espaces peuvent être organisés comme suit
classes\A\A.php
classes\A\sub\A.php (le sous-sous-espace sera placé dans un fichier séparé)
classes\B\B.php

PHP a une constante magique __NAMESPACE__ qui contient le nom de l'espace actuel.

Et maintenant sur le chargement automatique.

La classe ci-dessous n'est pas la mienne, je l'ai juste fait fonctionner et je l'ai un peu améliorée, tirée d'ici.
Attention: Pour que vos classes soient chargées, le nom de la classe doit correspondre au nom du fichier !

" .$fichier ." dans " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closeir($handle); ) fonction statique privée StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." / Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y Son") ."

" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Si vous regardez les noms des classes qui sont chargées, vous verrez que chaque classe est précédée d'un préfixe de l'espace de noms spécifié lors de l'utilisation. C'est pourquoi je recommande d'utiliser l'emplacement des fichiers dans des répertoires similaires à l'espace de noms ; cela accélère la recherche à une ou deux itérations.

Maintenant, notre index peut s'écrire comme ceci :
Désormais, toutes les classes et interfaces que vous utiliserez seront chargées automatiquement.

Pour démontrer certaines des capacités dynamiques du langage avec les espaces, déclarons une autre classe :
test.php

Index.php
sayName("test"); //ou vous pouvez faire ceci test\sayName("test2"); //ou comme ça $obj::sayName("test"); //ou vous pouvez faire ceci test::sayName("test2");

J'espère que mon article sera utile à quelqu'un.

(PHP 5 >= 5.3.0, PHP 7)

Avant de discuter de l'utilisation des espaces de noms, il est important de comprendre comment PHP sait quel élément d'espace de noms votre code demande. Une analogie simple peut être faite entre les espaces de noms PHP et un système de fichiers. Il existe trois manières d'accéder à un fichier dans un système de fichiers :

  1. Nom de fichier relatif comme foo.txt. Ceci résout à répertoire actuel/foo.txt où répertoireactuel est le répertoire actuellement occupé. Donc si le répertoire courant est /home/foo, le nom se résout en /home/foo/foo.txt.
  2. Nom de chemin relatif comme sous-répertoire/foo.txt. Ceci résout à répertoire actuel/sous-répertoire/foo.txt.
  3. Nom de chemin absolu comme /main/foo.txt. Ceci résout à /main/foo.txt.
Le même principe peut être appliqué aux éléments avec espace de noms en PHP. Par exemple, un nom de classe peut être référencé de trois manières :
  1. Nom non qualifié ou nom de classe sans préfixe comme $a = nouveau foo(); ou foo::staticmethod(); espace de noms actuel, cela résout à espace de noms actuel\foo foo. Une mise en garde : les noms non qualifiés pour les fonctions et les constantes seront résolus en fonctions et constantes globales si la fonction ou la constante avec espace de noms n'est pas définie. Voir Utilisation des espaces de noms : retour à la fonction/constante globale pour plus de détails.
  2. Nom qualifié ou nom de classe préfixé comme $a = nouveau sous-espace de noms\foo(); ou sous-espace de noms\foo::staticmethod();. Si l'espace de noms actuel est espace de noms actuel, cela résout à espace de noms actuel\sous-espace de noms\foo. Si le code est un code global sans espace de noms, cela se résout en sous-espace de noms\foo.
  3. Nom complet ou nom préfixé avec un opérateur de préfixe global tel que $a = nouveau \currentnamespace\foo(); ou \currentnamespace\foo::staticmethod();. Cela correspond toujours au nom littéral spécifié dans le code, espace de noms actuel\foo.

Voici un exemple des trois types de syntaxe dans le code réel :

espace de noms Foo\Bar\subnamespace ;

const FOO = 1 ;
fonction foo()()
classe foo
{
}
?>

espace de noms Foo\Bar ;
inclure "file1.php" ;

const FOO = 2 ;
fonction foo()()
classe foo
{
fonction statique méthodestatique()()
}

/* Nom non qualifié */
foto(); foo::staticmethod(); écho FOO ;

/* Nom qualifié */
sous-espace de noms\foo(); // se résout en fonction Foo\Bar\subnamespace\foo
sous-espace de noms\foo::staticmethod(); // se résout en classe Foo\Bar\subnamespace\foo,
// méthode méthodestatique
echo sous-espace de noms\FOO; // se résout en constante Foo\Bar\subnamespace\FOO

/* Nom complet */
\foo\bar\foo(); // se résout en fonction Foo\Bar\foo
\foo\bar\foo::staticmethod(); // se résout en classe Foo\Bar\foo, méthode staticmethod
echo\Foo\Bar\FOO; // se résout en constante Foo\Bar\FOO
?>

Notez que pour accéder à n'importe quelle classe, fonction ou constante globale, un nom complet peut être utilisé, tel que \strlen() ou \Exception ou \INI_TOUS. ?>

Bonjour. Dans l'article d'aujourd'hui, nous examinerons, que sont les espaces de noms en PHP.

Si vous l'utilisez depuis longtemps POO, alors vous avez probablement rencontré une situation où, lors de la connexion d'une bibliothèque tierce, vous avez rencontré un échec dû au fait que vous utilisez déjà les mêmes noms de classe dans votre code que dans la bibliothèque. Cela peut surtout se produire si vous utilisez des noms courants comme "modèle", "db" etc. Je vais vous dire maintenant comment résoudre ce problème.

Espace de noms- il s'agit d'une sorte de stockage créé pour le regroupement abstrait d'identifiants uniques (noms).

Ceux. si vous utilisez espaces de noms, vous pouvez alors connecter en toute sécurité des bibliothèques tierces et ne pas avoir peur qu'elles portent les mêmes noms que dans votre code. Finissons avec la théorie et passons à la pratique.

Créons un fichier maclasse.php avec ce contenu

espace de noms mon\oneProject ;
classe MaClasse ( )
?>

Ici, nous avons créé une classe dans l'espace de noms mon\unProjet. À propos, vous devez écrire exactement la barre oblique inverse. Ne vous y trompez pas !

Maintenant dans le dossier index.phpécrivons ce qui suit

require_once("maclasse.php");
$mc = new MaClasse(); // Erreur : classe introuvable
$mc = nouveau mon\oneProject\MyClass(); // tout fonctionne
?>

Comme vous pouvez le constater, il n’est désormais plus possible de créer une classe comme ça, il faut préciser dans quelle espace de noms il est couché.

Nous pouvons en spécifier plusieurs à la fois espaces de noms dans un seul fichier

Projet d'espace de noms ;

Const CONNECT_OK = 1 ;
connexion de classe ( )
fonction connecter() ( )

Espace de nomsAutreProjet ;

Const CONNECT_OK = 1 ;
connexion de classe ( )
fonction connecter() ( )
?>

Malgré le fait que nous ayons des noms de classes, de fonctions et de constantes absolument identiques, nous n'aurons pas de conflit de noms, car ils se trouvent dans des espaces différents.

Nous pouvons également utiliser la syntaxe entre crochets.

Projet d'espace de noms (

Const CONNECT_OK = 1 ;
connexion de classe ( )
fonction connecter() ( )
}

Espace de noms AnotherProject (

Const CONNECT_OK = 1 ;
connexion de classe ( )
fonction connecter() ( )
}
?>

Si vous combinez le code dans espace de noms global avec du code dans d'autres espaces, alors seule la syntaxe avec crochets est utilisée.

Projet d'espace de noms (

Const CONNECT_OK = 1 ;
connexion de classe ( )
fonction connecter() ( )
}

Espace de noms ( // code global
session_start();
$a = Projet\connect();
echo Projet\Connexion::start();
}
?>

N'oubliez pas non plus que la définition d'un espace de noms doit toujours être la première ligne de code. Si tu écris comme ça, il y aura une erreur

Pour savoir dans quel espace de noms vous vous trouvez actuellement, vous pouvez utiliser la constante __ESPACE DE NOM__

Projet d'espace de noms ;
echo """, __NAMESPACE__, """; // affichera "Projet"
?>

En utilisant cette constante, vous pouvez, par exemple, construire dynamiquement des noms

Projet d'espace de noms ;

Fonction incl ($ nom de classe) (
$a = __NAMESPACE__ . "\\" . $nom de classe ;
renvoie un nouveau $a ;
}
?>

C'est donc tout pour aujourd'hui. Vous pouvez obtenir plus d'informations et de connaissances pratiques en suivant le cours

  • Traduction
  • Tutoriel
Note per. : Je suis conscient qu'au moment de la traduction, la version actuelle de PHP est 5.5, et qu'il existe également un manuel judicieux. Mais j'ai trouvé intéressant la façon dont l'auteur présente la fonctionnalité d'espace de noms. Peut-être que l'article aidera certains de ceux qui apprennent juste les bases (et pas seulement, il y a de nombreux développeurs barbus qui ont opté pour PHP 5.2). Hodor.

En PHP, à partir de la version 5.3, les espaces de noms sont apparus. La plupart des langages modernes disposent depuis longtemps de cette fonctionnalité, mais PHP était un peu en retard. Cependant, chaque nouvelle fonctionnalité a son objectif, découvrons comment nous pouvons bénéficier de l'utilisation de l'espace de noms.

En PHP, vous ne pouvez pas avoir deux classes nommées de la même manière, elles doivent toutes être uniques. Le problème avec cette limitation est que si vous utilisez la bibliothèque tierce de quelqu'un d'autre qui fournit une classe nommée User , vous ne pouvez pas créer votre propre classe également nommée User . C'est vraiment dommage, car User est un nom très pratique pour une classe, n'est-ce pas ?

Les espaces de noms nous permettent de contourner ce problème et nous pouvons créer autant de classes d'utilisateurs que nécessaire. Les espaces de noms nous permettent également d'organiser notre code en packages pratiques, ainsi que d'indiquer notre propriété sur ce code.

Jetons un coup d'œil à une classe très courante. Oui... Je sais que vous les avez déjà utilisés, qu'est-ce que les espaces de noms ont à voir avec ça ? Fais-moi confiance là-dessus, d'accord ?

Espace de noms global

Voici un cours très simple :
Rien de spécial comme vous pouvez le voir, et si vous souhaitez l'utiliser, faites simplement ceci :
Dale, je connais un peu PHP...

D'accord, d'accord, désolé. Le fait est que nous pouvons considérer cette classe comme faisant partie de l'espace de noms global. Je ne suis pas entièrement sûr que ce soit le bon terme, mais cela me semble tout à fait approprié. En fait, cela signifie que la classe n’appartient à aucun package, juste à une classe ordinaire.

Utilisation facile des espaces de noms

Créons un autre Eddard, à côté du global.
Nous avons ici une classe très similaire avec un petit changement, l'ajout d'une directive d'espace de noms. Espace de noms de chaîne Stark ; indique à PHP que nous travaillons dans l'espace de noms Stark et que tout code (déclarant des classes, des fonctions, des variables, etc.) y fera référence.

Nous devons donc créer un nouvel Edd, si vous décidez que cela doit être fait comme ceci :
Alors non, ce n'est pas vrai. Ici, nous obtenons une instance de la classe du premier exemple que nous avons créé précédemment. Pas celui de l'espace de noms Stark. Essayons de créer une instance d'Eddard Stark.
Pour créer une instance d'une classe, nous devons préfixer le nom de la classe avec un préfixe du nom de l'espace de noms auquel la classe appartient et l'utiliser comme séparateur barre oblique inverse. En conséquence, nous avons une instance exactement de la classe dont nous avons besoin. N'est-ce pas magique ?

À propos, les espaces de noms peuvent former une hiérarchie arbitrairement complexe, utilisant autant de niveaux que nécessaire. Par exemple:
This\Namespace\And\Class\Combination\Is\Silly\But\Works

Théorie de la relativité

Rappelez-vous comment je vous ai dit que PHP fonctionne toujours par rapport à l'espace de noms actuel. Jetons un coup d'œil à cela en action :
En ajoutant une directive d'espace de noms, nous faisons savoir à PHP que nous sommes dans l'espace de noms Stark. Puisque c'est là que nous avons défini la classe Eddard, c'est exactement ce que nous obtiendrons. Vous voyez, tout est relatif.

Maintenant que nous avons modifié l'espace de noms, nous avons un petit problème. Une idée de ce dont je parle ? Maintenant, comment pouvons-nous obtenir notre classe Eddard originale ? Eh bien, celui dans l’espace global ?

Heureusement, PHP a une astuce qui nous permet de résoudre ce problème : simplement en ajoutant \ au nom de la classe.
En voyant la barre oblique, PHP comprend que nous devons regarder au-delà de l'espace de noms actuel et crée une instance de la classe dont nous avons besoin.

Maintenant, utilisez votre imagination. Imaginez que nous ayons une classe d'un espace de noms différent appelée Tully\Edmure. Nous devons maintenant l'utiliser dans l'espace Stark. Et comment faisons-nous cela ?

Encore une fois, nous avons dû utiliser une barre oblique inverse pour passer au niveau global avant d'instancier la classe dans l'espace Tully.

En général, faire référence à des classes d'autres espaces de noms comme celui-ci, en utilisant la hiérarchie complète dans le nom, peut être assez fastidieux. Mais heureusement, il existe une option pour créer un raccourci, jetons-y un coup d'œil :

En utilisant la directive use, nous pouvons obtenir une classe d’un espace de noms différent. S'il vous plaît, ne me demandez pas « pourquoi n'avons-nous pas mis une barre oblique ici parce que je ne sais tout simplement pas ? Pour autant que je sache, c'est la seule exception. Non, vous pouvez utiliser une barre oblique ici. mais cela n'aura aucun sens.

Oh, encore un petit truc ! Nous pouvons donner des surnoms à nos classes importées :
En utilisant le mot-clé as, nous avons donné à la classe Tully/Brynden le surnom Blackfish, ce qui nous permet d'utiliser le nouveau surnom pour l'identifier dans l'espace de noms actuel. Astucieux, n'est-ce pas ? Ceci est également très pratique si vous devez utiliser deux classes nommées de la même manière dans le même espace de noms :

En donnant aux Daenerys de l'espace Dothraki le surnom de Khaleesi, nous pouvons utiliser les deux classes de Daenerys. Assez pratique, nous pouvons y utiliser toutes les classes nécessaires dans notre application.

Structure

Les espaces de noms peuvent également nous aider à organiser notre code. Laissez-moi vous démontrer.

Disons que je souhaite créer une bibliothèque open source. J'adorerais que d'autres puissent utiliser mon code, ce serait génial ! Le problème est que les noms de classe dans mon code sont en conflit avec la propre application de ma bibliothèque par l'utilisateur. Ce serait terriblement gênant. Voici comment je résoudrais ce problème :
Dayle\Blog\Content\Post Dayle\Blog\Content\Page Dayle\Blog\Tag
Ici, j'ai utilisé mon nom pour montrer que le code est le mien et pour séparer mon code du code utilisateur de ma bibliothèque. Dans l'espace de noms de base, j'ai créé une structure de classes en fonction de leur hiérarchie.

Une fois que vous aurez commencé à utiliser composer, vous apprendrez à utiliser les espaces de noms pour faciliter le chargement automatique du code. Je vous recommande fortement de jeter un œil à ce mécanisme utile.

Défauts

À vrai dire, je me sens un peu coupable d’appeler ce sous-titre « Inconvénients ». Ce dont je vais parler n’est pas réellement une erreur.

Le fait est que dans d'autres langages, la fonctionnalité des espaces de noms est implémentée de la même manière et, en même temps, les langages fournissent des fonctionnalités supplémentaires pour interagir avec les espaces de noms.

En Java, par exemple, vous pouvez importer plusieurs classes dans l'espace de noms actuel à l'aide de l'instruction import. En Java, l'importation est analogue à l'utilisation et utilise des points pour séparer les espaces de noms (ou packages) imbriqués. Voici un exemple :
importer dayle.blog.* ;
Cela importera toutes les classes du package « dayle.blog ».

Vous ne pouvez pas faire cela en PHP. Vous devez importer chaque classe séparément. Désolé. En fait, pourquoi je m'excuse ? Allez-y et plaignez-vous auprès de l'équipe de développement PHP, mais je vous demande d'être poli. Ils ont fait beaucoup de choses intéressantes ces derniers temps.

Voici une astuce intéressante pour atténuer un peu le problème. Imaginez que nous ayons la structure de classe de l’exemple précédent. Nous pouvons prendre une partie du sous-espace et lui donner un alias.
Cela peut être utile lorsque vous utilisez un grand nombre de classes. Bonne chance à tous !

J'accepterai volontiers tous les souhaits et suggestions dans un message personnel, merci.