Comment ajouter partiellement un espace de noms PHP à une bibliothèque sans casser le code existant?


10

Mon entreprise a créé un framework PHP modulaire au fil des ans, bien avant que PHP 5.3 n'ait ajouté d'espaces de noms. Récemment, nous avons décidé de commencer à utiliser des espaces de noms dans le nouveau code de notre bibliothèque, et nous avons l'intention de l'espace de noms de l'ancien code à terme. Cependant, nous essayons de résoudre quelques problèmes pour déterminer si l'ajout d'espaces de noms à une base de code antérieure à la version 5.3 n'est pas une bonne idée:

  1. Puis-je nommer une classe mais aussi importer (utiliser) l'espace de noms global pour que toutes les classes globales n'aient pas besoin d'un \préfixe?
  2. Si nous nommons une classe existante dans notre bibliothèque, comment pouvons-nous empêcher tous les projets existants de se casser dès la mise à niveau du framework? Par exemple, la bibliothèque peut-elle changer le nom de la classe ThemeEngineen \module\theme\ThemeEngine, mais les sites Web existants appellent ThemeEnginesans aucune modification de code? Si oui, à quoi ressemblerait ce code?

Réponses:


2
  1. Vous ne pouvez pas du tout "utiliser" les espaces de noms, malheureusement, uniquement les classes: http://www.php.net/manual/en/language.namespaces.importing.php . Edit: vous pouvez importer des classes à partir de l'espace de noms global, comme elles l'ont fait avec ArrayObject dans l'un des exemples.

  2. Vous pourriez avoir une section globale d'instructions use afin que toutes les classes préexistantes, qui se trouvent également dans l'espace de noms global, devraient théoriquement trouver les classes très bien. Théoriquement...

Nous sommes dans le même bateau que vous, en quelque sorte. Nous avons un ancien code qui n'utilise pas d'espaces de noms, mais utilise le faker d'espace de noms _ (comme Zend_Db_Table ...) et nous avons un code plus ancien qui ne fait même pas de faux espaces de noms. Nous allons probablement emprunter le même chemin, mais nous devons encore tester si c'est possible. Bonne chance!


1

Oui, ce que j'ai fait à la fin, c'était utiliser - 'utiliser' pour importer les classes individuelles dont j'avais besoin

par exemple au lieu d'ajouter '/' devant tout comme:

\DateTime()

J'ai ajouté sous mon espace de noms

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.