Як частково додати простір імен PHP до бібліотеки без порушення існуючого коду?


10

Моя компанія створила модульну основу PHP протягом багатьох років, починаючи задовго до того, як PHP 5.3 додав простори імен. Нещодавно ми вирішили почати використовувати простори імен у новому коді нашої бібліотеки, і ми маємо намір в кінці кінців простору імен старий код. Однак у нас є кілька питань, які ми намагаємося розібратися, щоб визначити, чи додавати простори імен до бази даних коду до v5.3 просто не є хорошою ідеєю:

  1. Чи можу я простір імен класу, але й імпортувати (використовувати) глобальний простір імен, щоб усі глобальні класи не потребували \префікса?
  2. Якщо ми називаємо простір імен існуючим класом у нашій бібліотеці, то як ми можемо не допустити, щоб усі існуючі проекти порушилися, як тільки рамки оновлюються? Наприклад, чи може бібліотека змінити назву класу ThemeEngineна \module\theme\ThemeEngine, але існуючі веб-сайти дзвонять ThemeEngineбез будь-якої модифікації коду? Якщо так, як би виглядав цей код?

Відповіді:


2
  1. Ви не можете "використовувати" простори імен взагалі, на жаль, лише класи: http://www.php.net/manual/en/language.namespaces.importing.php . Редагувати: Ви можете імпортувати класи з глобальної простори імен, як це було зроблено з ArrayObject в одному з прикладів.

  2. Ви можете мати глобальний розділ висловлювань про використання, щоб усі попередні класи, які також є в глобальному просторі імен, теоретично повинні знаходити класи просто чудовими. Теоретично ...

Ми в тому ж човні, що і ви, начебто. У нас є старий код, який не використовує простори імен, але він використовує факер простору імен (наприклад, Zend_Db_Table ...), і у нас є старіший код, який навіть не підробляє простори імен. Ми, мабуть, підемо тим самим маршрутом, але нам ще потрібно перевірити, чи це взагалі можливо. Удачі!


1

Так, те, що я зробив, врешті-решт, було використання - «використання» для імпорту окремих потрібних мені класів

наприклад, замість того, щоб додавати "/" перед усім, як:

\DateTime()

Я додав під своїм простором імен

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.