Jak częściowo dodać przestrzeń nazw PHP do biblioteki bez zerwania istniejącego kodu?

10

Moja firma przez lata tworzyła modułowe środowisko PHP, zaczynając na długo przed dodaniem przestrzeni nazw przez PHP 5.3. Niedawno postanowiliśmy zacząć używać przestrzeni nazw w nowym kodzie naszej biblioteki i zamierzamy w końcu zamienić stary kod przestrzeni nazw. Mamy jednak kilka problemów, nad którymi staramy się ustalić, czy dodanie przestrzeni nazw do bazy kodu wcześniejszej niż 5.3 nie jest dobrym pomysłem:

  1. Czy mogę przestrzeni nazw klasy, ale także importować (używać) globalną przestrzeń nazw, aby wszystkie klasy globalne nie potrzebowały \prefiksu?
  2. Jeśli nazwamy istniejącą klasę w naszej bibliotece, jak możemy zapobiec awarii wszystkich istniejących projektów, gdy tylko uaktualni się framework? Można na przykład biblioteka zmienić nazwę klasy ThemeEnginedo \module\theme\ThemeEngine, ale istniejące strony internetowe dzwonić ThemeEnginebez jakiejkolwiek modyfikacji kodu? Jeśli tak, jak wyglądałby ten kod?
jimp
źródło

Odpowiedzi:

2
  1. Niestety nie można w ogóle „używać” przestrzeni nazw: tylko klasy: http://www.php.net/manual/en/language.namespaces.importing.php . Edycja: Możesz importować klasy z globalnej przestrzeni nazw, tak jak zrobiono to z ArrayObject w jednym z przykładów.

  2. Możesz mieć globalną sekcję instrukcji użycia, aby wszystkie wcześniej istniejące klasy, które również znajdują się w globalnej przestrzeni nazw, teoretycznie powinny znaleźć klasy. Teoretycznie ...

W pewnym sensie jesteśmy na tej samej łodzi. Mamy trochę starego kodu, który nie korzysta z przestrzeni nazw, ale używa fałszera przestrzeni nazw _ (jak Zend_Db_Table ...) i mamy starszy kod, który nawet nie fałszuje przestrzeni nazw. Prawdopodobnie wybieramy tę samą trasę, ale nadal musimy sprawdzić, czy to w ogóle możliwe. Powodzenia!

Pelshoff
źródło
1

Tak, w końcu to, co zrobiłem, to użycie - „use” do zaimportowania poszczególnych klas, których potrzebowałem

na przykład zamiast dodawać „/” przed wszystkim, takim jak:

\DateTime()

Dodałem pod moją przestrzenią nazw

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
Stevanicus
źródło