Wie füge ich einer Bibliothek teilweise PHP-Namespaces hinzu, ohne vorhandenen Code zu beschädigen?

10

Mein Unternehmen hat im Laufe der Jahre ein modulares PHP-Framework erstellt, lange bevor PHP 5.3 Namespaces hinzufügte. Vor kurzem haben wir beschlossen, Namespaces im neuen Code unserer Bibliothek zu verwenden, und wir beabsichtigen, den alten Code irgendwann zu benennen. Wir haben jedoch einige Probleme, die wir zu lösen versuchen, um festzustellen, ob das Hinzufügen von Namespaces zu einer Codebasis vor Version 5.3 keine gute Idee ist:

  1. Kann ich eine Klasse mit einem Namespace versehen, aber auch den globalen Namespace importieren (verwenden), sodass alle globalen Klassen kein \Präfix benötigen ?
  2. Wenn wir eine vorhandene Klasse in unserer Bibliothek mit einem Namespace versehen, wie können wir verhindern, dass alle vorhandenen Projekte beschädigt werden, sobald das Framework aktualisiert wird? Zum Beispiel kann die Bibliothek Änderung der Name der Klasse ThemeEnginezu \module\theme\ThemeEngine, aber die bestehenden Websites aufrufen , ThemeEngineohne jede Code - Änderung? Wenn ja, wie würde dieser Code aussehen?
jimp
quelle

Antworten:

2
  1. Sie können leider überhaupt keine Namespaces verwenden, sondern nur Klassen: http://www.php.net/manual/en/language.namespaces.importing.php . Bearbeiten: Sie können Klassen aus dem globalen Namespace importieren, wie dies mit dem ArrayObject in einem der Beispiele der Fall war.

  2. Sie könnten einen globalen Abschnitt mit Verwendungsanweisungen haben, sodass alle bereits vorhandenen Klassen, die sich ebenfalls im globalen Namespace befinden, theoretisch die Klassen in Ordnung finden sollten. Theoretisch...

Wir sitzen im selben Boot wie Sie. Wir haben alten Code, der keine Namespaces verwendet, aber den _ Namespace-Faker (wie Zend_Db_Table ...), und wir haben älteren Code, der nicht einmal Namespaces fälscht. Wir werden wahrscheinlich den gleichen Weg gehen, aber wir müssen noch testen, ob es überhaupt möglich ist. Viel Glück!

Pelshoff
quelle
1

Ja, was ich am Ende getan habe, war use - 'use', um die einzelnen Klassen zu importieren, die ich brauchte

Zum Beispiel, anstatt '/' vor allem wie:

\DateTime()

Ich habe unter meinem Namespace hinzugefügt

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
Stevanicus
quelle