Dienstag, 5. Oktober 2010

namespace-Unsinn: "solved"

Nach dem ich heute durch das Zend-Webinar zum Thema Debugging (noch nicht online) wieder auf das Thema PHP-namespaces gekommen bin, ist das "Problem" vorerst "gelöst".
Kurzfassung: Es gibt kein Namespace-Import, nur ein Namespace-Aliasing.

Wenn ich jetzt bei php.net/namespace nachlese, ist das auch total verständlich:
Wenn man "use \foo\bar;" nutzt, ist dies nur die Kurzform von "use \foo\bar as bar;", was lediglich erlaubt "new bar\class();" statt der langen Form "new \foo\bar\class();" zu nutzen.
Mittels use kann man nicht dafür sorgen, dass eine Klasse in einem anderen Namespace ohne Prefix angesprochen werden kann. Ausschließlich Klassen auf der selben Ebene im selben Namespace können ohne Prefix angesprochen werden. Selbst für den globalen Namespace ist bei Klassen immer der \ erforderlich (gilt nicht für Funktionen und Konstanten)

Das bleibende Problem ist halt einfach nur, das selbst ich, der zu 99% nur PHP programmiert, zu sehr in Java denkt. Was ich mir eigentlich wünsche ist "import foo.bar.*;". Aus aktueller PHP-Sicht wäre das also ein "use \foo\bar\*"; was sowas wäre wie "use \foo\bar\* as ${classname};" oder so ähnlich.
Das kann PHP aber nicht.
Da das use-Statement sich aber auf die ganze Datei bezieht, kann man auch keinen eigene use-Implementation schreiben, die im Falle eines * anhand der Verzeichnisstruktur alle Klassen einzeln "aliased".

Fazit:
"use" sollte in "alias" (oder, da es in der Doku oft mit dem Dateisystem verglichen wird, "link") umbenannt werden. Vergesst das Java-"import" und C#-"use". PHP kocht mal wieder sein eigenes Süppchen, dass mir bisher nicht schmeckt.

Danke Jan.

Freitag, 3. September 2010

namespace-Unsinn

So. Dies ist der erste echte Post. Dies sind meine Gedanken die ich an keine Person ableiten konnte und deshalb diesen Blog als Ventil brauchen.

Ich habe mich gerade mit dem in PHP 5.3 neuen Feature namespaces beschäftigt. An sich eine überfällige Sache. Dies sieht man schnell wenn man sich mal die Namensnennung der Klassen im Zend-Framekwork anschaut.
Mir ist das Feature schon seit Monaten bekannt, aber in bestehenden Projekten hat man nicht das Glück (bisher dachte ich zumindest es würde ein Glück werden) dies einsetzten zu können.
Also habe ich mir aus Spaß gedacht: Fang doch einfach mal bei Null an. Wie würde man ein Framework jetzt mit dem Feature aufbauen.

Nur bin ich nicht weit gekommen. PHP nutzt das use-Keyword ähnlich anderen Programmiersprachen, um bereits bekannte Klassen im aktuellen Kontext ohne "full qualified name" benutzen zu können (siehe). Nur kollidiert dieses "bereits bekannte Klassen" mit dem __autoload-Feature das bisher in PHP wichtig war.
Solang man den "full qualified name" (z.B. »new \foo\bar\Klasse()«) lädt, kann man mit autoload ohne Probleme die richtige Datei includen. Benutzt man stattdessen »use \foo\bar; new Klasse()« gibt es keine Möglichkeit im autoload die richtige Datei zu finden. Wenn man also nicht jedesmal die Klassen-Datei includen und den Namespace useen will...
»include "foo/bar/Klasse.php";
use \foo\bar;
new Klasse();«
...bleibt nur ALLE Dateien im Vorhinein zu includen, um dann nur noch das use-Kommando zu benutzen.
Das wäre aber in PHP bei durchschnittlichen Librarys so unperformant, dass es niemals in Frage kommt.

So, Luft ist raus. Danke dir Weltweites Spinnennetz.

PS. Falls wer Artikel (auch Englisch) kennt, die sich schon mit dem Thema beschäftigen, oder ich einem Irrtum unterliege, bin ich für Kommentare immer dankbar.

YAUB (Yet Another Useless Blog)

Und da gibt es wieder einen Blog mehr in der weiten Welt des Internets...

Ich bin es langsam Leid kein Ventil für meine absurden Gedanken zu haben. Deshalb lass ich mich mal wieder für einen Social-Networking-Hype hinreißen. Ich bin halt auch nur ein Durchschnittsmensch:
  • Ich leb' mit meiner Freundin seit Jahren in einer nicht geehelichten Lebensgemeinschaft in einer Miet-Wohnung in einer Großstadt mit 2 Katzen
  • Ich bin bei Facebook, Twitter, MeinVZ, XING; habe eine G-Mail-, ein dutzend GMX- und einige anderen E-Mail-Adressen
  • Ich spiele wie viele Millionen andere Menschen WoW
  • Ich arbeite in einer 40 Stunden Woche am Computer
  • ... und verbringe zu Hause nochmal mindestens genau so viel Zeit vorm Rechner
Und ich weiß, dass das alles und was es noch über mich zusagen gäbe keinen Interessiert.

Also was über den Blog:
Mein Arbeitsumfeld als Programmier sind verschieden Open Source-Projekte. Dies Umfasst neben PHP auch: JavaScript, MySQL, Linux, Java, etc.
Ich rege mich aber auch des öfteren mal über kommerzielle Sachen wie Oracle, Windows... und achja Oracle auf.
Der Name des Blogs bezieht sich deshalb auf eine für PHP sehr bezeichnendes Feature: Magischen Konstanten.