Hallo Community,
dieses Thema ist einerseits zum verstehen und andererseits zum Lösen meines Problems gedacht.
Mit PHP 5.3 wurden Namespaces eingeführt - wie natürlich jeder weis. Das Problem dabei gilt allerdings meiner Bibliothek. Hierfür stelle ich einmal kurz die Ordnerstruktur vor:
Alle Ordner dienen der Applikation und werden durch /pub/index.php aufgebaut. Durch eine .htaccess wird ähnlich wie bei Zend jeder Request auf die index.php gesteuert.
Jetzt sollte natürlich die Bibliothek, die sich um die Applikation kümmert und der Bibliothek, die sich um die Businesslogik kümmert getrennt werden. Das ganze ist derzeit so aufgebaut:
Im Folder TofFw, werden die Applikationsdateien abgelegt. Im anderen die Businesslogik Dateien.
Natürlich haben beide eigene Namensräume - so erhält bspw. TofFw den Namensraum TofFw und My natürlich selbsterklärenderweise My.
Grundsätzlich möchte ich also mehrere Bibliotheken wie bei den alten Projekten eben auch (< PHP 5.3). Das ganze ist sogesehen durch die Autoload-Methoden kein Problem (so dachte ich zumindest). Jetzt allerdings nach ein paar praktischen Anwendungen kommt folgendes Problem:
Natürlich möchte ich, wenn ich schon Namensräume verwende auch keine ewige Klassennamen mit den direkten Namensräumen angeben. Das bedeutet, dass ich am Anfang der Klasse mit use arbeite. Also bspw.:
Grundsätzlich scheint es hier kein Problem zu geben, da beide Klassen im selben Namensraum liegen und der Autoloader folgende Daten bekommen würde:
Hier kann ich natürlich einfach die jeweiligen Dateien includieren. Das Problem gibt es allerdings im folgenden Fall:
Jetzt erhält der Autoloader A und X, da beide Namespaces natürlich direkt angegeben werden.
Sogesehen wäre das ganze kein Problem - denn dafür war ja laut dem PHP Manual die Globale Konstante __NAMESPACE__ vorgesehen. Jetzt allerdings folgendes Problem: Namespace enthält immer den letzten use. Das heißt also in meinem Fall TofFw\App.
Da aber X nun nicht im Namensraum TofFw\App liegt, kann ich nicht der einfacher halt halber \ durch / ersetzten und die Datei laden.
Das Problem ist offensichtlich: Gibt es eine Lösung, die meinem Problem weiterhilft oder liege ich mit meiner Anwendung von Namespace komplett Falsch.
Aber wenn ich das ganze richtig verstehe wäre es so der beste Weg mehrere Bibliotheken inkl. Namensräume zu benutzen...
dieses Thema ist einerseits zum verstehen und andererseits zum Lösen meines Problems gedacht.
Mit PHP 5.3 wurden Namespaces eingeführt - wie natürlich jeder weis. Das Problem dabei gilt allerdings meiner Bibliothek. Hierfür stelle ich einmal kurz die Ordnerstruktur vor:
app/
lib/
res/
pub/
lib/
res/
pub/
Jetzt sollte natürlich die Bibliothek, die sich um die Applikation kümmert und der Bibliothek, die sich um die Businesslogik kümmert getrennt werden. Das ganze ist derzeit so aufgebaut:
lib/TofFw
lib/My
lib/My
Natürlich haben beide eigene Namensräume - so erhält bspw. TofFw den Namensraum TofFw und My natürlich selbsterklärenderweise My.
Grundsätzlich möchte ich also mehrere Bibliotheken wie bei den alten Projekten eben auch (< PHP 5.3). Das ganze ist sogesehen durch die Autoload-Methoden kein Problem (so dachte ich zumindest). Jetzt allerdings nach ein paar praktischen Anwendungen kommt folgendes Problem:
Natürlich möchte ich, wenn ich schon Namensräume verwende auch keine ewige Klassennamen mit den direkten Namensräumen angeben. Das bedeutet, dass ich am Anfang der Klasse mit use arbeite. Also bspw.:
PHP-Code:
use TofFw\X;
use TofFw\A;
$a = new A();
$x = new X();
A
X
X
PHP-Code:
use TofFw\X;
use TofFw\App\A;
$a = new A();
$x = new X();
Sogesehen wäre das ganze kein Problem - denn dafür war ja laut dem PHP Manual die Globale Konstante __NAMESPACE__ vorgesehen. Jetzt allerdings folgendes Problem: Namespace enthält immer den letzten use. Das heißt also in meinem Fall TofFw\App.
Da aber X nun nicht im Namensraum TofFw\App liegt, kann ich nicht der einfacher halt halber \ durch / ersetzten und die Datei laden.
Das Problem ist offensichtlich: Gibt es eine Lösung, die meinem Problem weiterhilft oder liege ich mit meiner Anwendung von Namespace komplett Falsch.
Aber wenn ich das ganze richtig verstehe wäre es so der beste Weg mehrere Bibliotheken inkl. Namensräume zu benutzen...
Kommentar