Weils so schön ist: Ein weiteres mal Zend_Loader_Autoloader. Ich hoffe damit endgültig mal (zumindest im deutschsprachigen Raum) mit den ewigen Diskussionen über “merkwürdiges Verhalten beim Laden von Klassen” abschließen zu können.

02.04.2010: Kleines (sprachliches) Update, su

Grundlage

Die Grundlage ist natürlich PHP selbst. PHP bietet dazu zwei Mechanismen:

  1. Eine selbst definierte Funktione __autoload($class) oder
  2. spl_autoload($lcass)

Die zweite Variante greift, sobald spl_autoload_register() einmal aufgerufen wird und sie ersetzt __autoload() vollständig. Genau das macht Zend_Loader_Autoloader beim ersten Aufruf von getInstance().

spl_autoload() nutzt einen Stack [1], man kann also beliebig viele eigene Loader registrieren, die von PHP selbst zum Laden von Klassen aufgerufen werden. Insbesondere bedeutet das, dass man problemlos auch Autoloader fremder Hersteller (zB Doctrine) ohne Anpassung weiter verwenden kann!

.

Zend_Loader_Autoloader kümmert sich pauschal nur um Klassen, die mit einem String beginnen, die er kennt (Prefix, Namespace). Wie man weitere Prefix bekannt macht, sehen wir gleich.

Zend_Loader_Autoloader: für die Library

Zend_Loader_Autoloader besitzt intern schonmal einen eigenen Loader. Dieser ist vorwiegend zu Laden von Library-Klassen gedacht!. Er mappt dabei einfach den Klassenbezeicher (zB) Zend_Controller_Front gegen den Dateinamen Zend/Controller/Front.php und sucht selbigen im include_path. Konkret: Die Library-Ordner (hier “Zend”) müssen sich in einem Ordner befinden, der in einen der im include_path angegebenen Pfade befindet!

Damit Autoloader nun auch andere Klassenbezeichner, als nur die mit dem “Zend”-Prefix berücksichtigt, macht man den Prefix mit registerNamespace() bekannt.

Zend_Loader_Autoloader_Resource: Für Anwendungs-Klassen

Autloader lässt sich sehr leicht um weiter, nicht dem obigen Standard folgenden Loadern erweitern, indem ihn Objekt, die Autoloader_Interface implementieren, oder Callbacks übergibt, dazu aber im Handbuch mehr [2], denn für gewöhnlich interessiert das erstmal wenig.

Eine Implementierung ist Zend_Loader_Autoloader_Resource. Dieser ["der Resource-Loader", Anm. des Authors] ist zum Laden der Modul-Klassen gedacht! Dazu wird zunächst ein Basis-Pfad und wiederum ein Prefix übergeben, weiterhin erhält er ein oder mehrere Typ-Namespaces plus dazugehörige Ordner. Das Mapping erfolgt nicht mehr einfach Klassenbezeichner-zu-Dateiname, sondern nur noch der Bezeichner ohne Prefix plus Typ-Namespace wird gegen den Basispfad plus Typ-Ornder gemappt:

Prefix: Blogmodule
Basispfad: /path/to/application/modules/blog

# Typ-Mappings:
Model => models/
Model_DbTable => models/DbTable/

# Beispiel
Blogmodule_Model_My_Class => /path/to/application/modules/blog/models/My/Class.php

Bei Instanzierung registriert sich der dieser Loader selbstständig beim Zend_Loader_Autoloader-Objekt, ein manuelles pushAutoloader() ist nicht notwendig.

Das, was man jetzt gehört hat, kann man schon fast wieder vergessen, denn Zend_Application_Module_Autoloader ist eine Erweiterung von Autoloader_Resource, ergänzt selbige durch typische Modul-Klassentypen und deren typische Verzeichnisse [3] und es wird für jedes Modul automatisch erstellt, welches eine Module-Bootstrap besitzt und wenn das Modules-Resource-Plugin von Zend_Application aktiviert ist. Für letzteres genügt ein “resources.modules[] =” in der application.ini.

Plugins Laden

Einige Komponenten, darunter Zend_Controller_Action_HelperBroker für die Action-Helper und Zend_View_Abstract für View-Helper, nutzen Zend_Loader_PluginLoader, der ähnlich funktioniert, wie der eben erwähnte Resource-Loader, allerdings selbst kein Autoloader ist. Er dient dazu bei einem verkürzten Klassenbezeichner [4] eine Klasse zu finden, indem er einfach alle registrierten Prefix-zu-Pfad-Varianten durchprobiert.

Will man hier etwas hinzufügen, kommt man an den Plugin-Loader für gewöhnlich mit der getPluginloader() auf das entsprechende Objekt, zB View, oder HelperBroker ran. Aber auch das ist (ähnlich wie für Application_Module_Autoloader) oft überflüssig. Das FrontController- bzw das View-Resource-Plugin [5] für Zend_Application nehmen einen diese Arbeit (mal wieder) über die application.ini ab:

resources.view.helperPath.My_Prefix = /path/to/my/viewhelpers
resources.frontcontroller.actionhelperpaths.My_Prefix = /path/to/my/actionhelpers

Ein kurzer Hinweis an dieser Stelle: Wenn Zend_Layout trotz gegebener Helferpfade eigene Helfer nicht findet, kann man prüfen, ob in application.ini die View-Resource vor der Layout-Resource definiert wird. Ist es anders herum, kann es passieren, dass der View-Renderer und Layout zwei verschiedene Views verwenden und somit Einstellungen an Einem am Anderen vorbei gehen.


[1]
Eigentlich eine Queue
[2]
Zend_Loader_Autoloader_Interface
[3]
Quelltext von Zend_Application_Module_Autoloader
[4]
Dem Bezeichner fehler der Prefix und er somit nicht eindeutigt.
[5]
Dies ist nicht bei Zend_Application dokumentiert, aber als Faustformel für die meisten Resource-Plugins: Was als set*-Methode existiert, lässt sich auch per application.ini setzen. In konkreten Fall ist es Zend_View_Abstract::setHelperPath() bzw für die Action-Helper schaut man einfach mal in den Sourcecode zu Zend_Application_Resource_Frontcontroller.
  1. 02.04.2010: Auf Wunsch eines einzelnen, anonymen Querulanten sprachlich hier und da rumgedoktort ;)

Da bin ich eben gerade über einen 2 Jahre alten Beitrag von mir über Magische Methoden und Eigenschaften in PHPDocumentor und Zend Neon [1] gestolpert. Darin geht es um die bösen magischen Methoden und Objekt-Attribute in PHP, die mittels der PHPDoc-Tags @property und method einmal von PHPDocumentor erkannt und dokumentiert, und von Zend Neon im Code vervollständigt werden können.

Mittlerweile nutz ich die Zend-IDE nicht mehr, sondern nur noch Eclipse PDT, was das Auflösen der Magie damals noch nicht beherrschte [2]. Jetzt geht es zumindest, deshalb schnell mal ein kurzer Abriss. Vorweg sei noch gesagt, das man (scheinbar) den Full-Qualified-Name für die Datentypen angeben muss, wenn man mit Namespaces arbeitet. Erstmal die Syntax, die sich seit über 2 Jahren nicht geändert hat [3][4]:

@property type $name1 description
@property-read type $name2 description
@property-write type $name3 description
@method returntype name() name(arg1type $arg1, arg2type $arg2, ...) description

Gerade @method wurde nicht hübscher. Im Code sieht das dann so aus:

< ?php
namespace my\name\space;

class Dummy {
  public function myDummy(){}
}

/**
 *
 * @property \my\name\space\Dummy $readwrite
 * @property-read \my\name\space\Dummy $readonly
 * @property-write \my\name\space\Dummy $writeonly
 * @method \my\name\space\Dummy myFunction
 */
Class Test {

}

$a = new Test();
$a->

Das kann man sich jetzt mal speichern und etwas herumprobierne. Aber etwas anders siehts dann doch aus … !? Es scheint so, also wenn PDT die Beschreibung und (bei den Methoden) die Signatur ignoriert [5], weshalb ich erstmal darauf verzichtet habe, bis ich mehr weiß. Dafür funktionieren die (Rückgabe)Typen problemlos und in der Outline-View tauchen die neuen Methoden und Properties ebenfalls auf [6]. Zum Schluss werf ich nochmal ein, dass auch immer:

/* @var type $name */

Funktioniert, um PDT einer Variablen einen bestimmten Typ unterzujubeln. Falls noch wer weitere Tipps hat, immer her damit. Ich bin allerdings schon überrascht, dass es bei Google garnicht sooo viele (brauchbare) Treffer zum Thema gibt…


[1] Heute heißt das Ding einfach “Zend Studio for Eclipse” (ZSfE)
[2] Falls jemand weiß, seit wann das auch PDT kann, möge derjenige mir doch eine kleine Nachricht hinterlassen.
[3] http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.property.pkg.html
[4] http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.method.pkg.html
[5] Wenn dazu mehr weiß, auch gerne mal kurz melden.
[6] zB zu sehen in einem Anhang zu einem Doctrine-Ticket

Im Oktober letzten Jahres habe ich noch vor EGit gewarnt, was im nachhinein vielleicht etwas vorschnell war, denn noch ist es auch jetzt noch in der Entwicklung. Damals ging es darum, dass EGit gerne mal Github Repositories zerlegt, ein entsprechender Hinweis samt möglicher Lösung hat es zwischenzeitlich auch in die Github Hilfe geschafft. Dort ist auch erwähnt, dass ein Bug in JGit den Fehler verursacht.

This can prevent cloning and fetching from the repo. The objects were never pushed to the remote repo, therefore support cannot recover the repo directly for the user. The only solution is for the user that pushed the commits to push them again from the command line.

Aber jetzt soll alles besser werden: Der Bug soll heute mit dem Release 0.7 geschlossen worden sein. Im gleichen Atemzug ist EGit jetzt auch zu eclipse.org umgezogen (wo waren sie denn vorher? :? )

Eclipse-typisch installiert man EGit über deren Update-Site. Wer noch skeptisch ist, kann auch weiterhin über Kommendozeile git push aufrufen.

Ursprünglich wollte ich diesen Beitrag schon eher verfassen, aber da verließ mich die Motivation und die Zeit. Nun hat mich allerdings Blackflash auf Git und Github angesprochen und das Versprechen, dass ich in seine März-Links komme, führte dann zum kurzfristigen Motivationsschub.

Die Links sind allesamt in den letzten Monaten immer mal wieder aufgeschnappt worden. Falls noch jemand den! Link hat, kann ich ihn ja noch ergänzen, aber eigentlich solls auch nur ein ersterer Einstieg sein. Die meisten Beiträge und Artikel enthalten selbst Links zu anderen Quellen (hin und wieder bewegt man sich dabei im Kreis ;) ) und wenn man denen aufmerksam folgt, bekommt man einen recht guten Eindruck.

(weiterlesen…)

Update 1: 12.01.2010 13:00; Siehe Unten

Will man selbst PHP-Bibliotheken veröffentlichen, steht man vor einem schlichten Problem: Wie? Die übliche (und einfachste) Antwort ist die manuelle Lösung, bei der man sich das Paket selbst herunterladen und entpacken muss. Dabei gibt es für PHP schon seit Jahren mit PEAR eine Paketverwaltung, die allerdings im Laufe der Zeit etwas in Vergessenheit geriet. Third-party Bibliotheken sind oft effektiver, viele PEAR-Pakete werden garnicht oder nur noch sporadisch weiter entwickelt, und letzten Endes gilt das dazugehörige CLI-Tool als komplex. Letzteres gilt eigentlich zu Unrecht, denn als einfacher Anwender braucht man nur die 2 Kommandos channel-discover und install.

Will man nun allerdings für den PEAR-Installer Pakete bereit stellen, sieht man sich zwangsläufig dazu verpflichtet selbst einen PEAR-Server, wie Pirum bereit zu stellen. Mal abgesehen davon, dass das nicht für jeden möglich ist, führt das auch dazu, dass jeder seinen eigenen, verteilten Server bereit stellt, der womöglich nur ein einziges Paket enthält. Von einem Verzeichnis kann hier nicht mehr gesprochen werden. Genau das könnten jetzt zwei Dienste entgegen wirken:
Pearhub (Introductory Blog Post) und Pearfarm (Announcing Pearfarm). Da beide noch sehr jung sind, kann man zwar keine Wunder erwarten, aber endlich mal gibt es sowas überhaupt für PHP-Entwickler, die nicht selbst einen Server aufsetzen wollen oder können.

Pearhub

Pearhub ist ein Ein-Mann-Projekt und so auch sehr einfach aufgebaut. Wie der Name schon andeutet (“Github“) ist dieser Dienst sehr eng mit Versionierungssystemen verknüpft, was auch der einzige Weg ist neue Paket-Releases zu veröffentlichen. Pearhub holt sich dabei die Dateien der Releases selbstständig aus beliebigen Git- oder SVN-Repositories, indem es diese nach Versions-Tags — also Tags mit Namen der Form “vX.Y.Z” oder “X.Y.Z” — absucht, von dort bestimmte Verzeichnisse zusammen sammelt und zusammen mit Properties, die bei der Erstellung des Pakets angegeben wurden, das Paket schnürt.

Aus Entwicklersicht ist dies auch schon alles. Man meldet sich mit einem OpenID-Benutzernamen an [1], erstellt ein Paket an, wobei man dort bereits Lizenz, Maintainer, Dependencies, usw für alle Pakete angibt. Danach wartet man, falls es schon versionierte Tags gibt. In Zukunft braucht man sich garnicht weiter darum kümmern.

Aus Anwendersicht ist es fast nocht einfach: Man muss den Channel nur einmal “erkunden” (pear channel-discover pearhub.org) und kann dann beliebige dort registrierte Pakete mit “pear install pearhub/PaketName” installieren. Es gibt dabei nur einen Channel, in dem alle Pakete alle Benutzer laden. Das spart das erkunden weiterer, verstreuter Channels.

Etwas störend ist, dass die Tags zwar nach eigenen Aussagen nach “Semantic Versioning” abgesucht werden, eine Version “0.5.0dev” erkannte es im Test bisher allerdings nicht. So scheint es, dass als “Status” nur “Completed” möglich ist. Zudem fehlt es an ein paar, nicht ganz unwichtigen package.xml-Properties, wie zB API-Version, optionale Abhängigkeiten, sowie einige Dependency-Arten und automatisierte Task. Die wichtigen sind allerdings alle vorhanden. Man könnte Pearhub noch vorwerfen, dass es keine Dokumentation gibt, aber die würde sich sowieso wie eine Anleitung für einen Toaster anfühlen.

Pearfarm

Pearhub dagegen wirkt fast schon traditionell. Es versucht einen ähnlichen Service anzubieten, wie die Rubygems für Ruby. Das macht Pearfarm etwas komplizierter als Pearhub, dafür aber auch mächtiger.

Als Entwickler sollte man sich trotzdem nicht abschrecken lassen, dann pearfarm gibt einen dafür ein handliches CLI-Tool an die Hand. Mit init erstellt man die “pearfarm.spec”, die man erstmal bearbeiten muss. Danach erstellt man direkt mit build das Paket, was man direkt mit push meinpaket.tar.gz hochladen kann [2]. In Zukunft muss man in der Spec-Datei nur noch die Versionsnummern anpassen.

Im Gegensatz zu Pearhub gibt es pro Nutzer einen eigenen Channel unter “benutzername.pearfarm.org”. Ein Anwender muss also jeden Benutzer einzeln “erkunden”, wenn er Pakete von verschiedenen Nutzern installieren will. Ansonsten ändert sich nichts.

Leider merkt man Perfarm schon eher einen gewissen Beta-Status an. Zum Beispiel ist als Lizenz nur die MIT-Lizenz möglich, weil die Links zu den Linzenzen fest einkodiert sind, es gibt davon aber bloss zur Zeit nur diese eine. Die Dokumentation ist ziemlich lückenhaft, was grad für die Spec-Datei etwas ungünstig ist. Ob “Ein-Channel-Pro-Nutzer” ein Nachteil ist, ist schwer zu sagen: So kann sich jeder beliebig ausleben und vielleicht eigene Bibliotheken noch etwas feiner aufteilen und mit Abhängigkeiten verknüpfen, aber einfach zum Stöbern und Installieren bei beliebigen Nutzern lädt es nicht ein.

Abschluss

Beides sind vielversprechende Dienste, die sehr unterschiedliche Wege gehen. Bei Pearhub vermisst man die Flexibilität der Spec-Dateien von Pearfarm. Andersherum vermisst man bei Pearfarm Pearhubs Automatisierung. Vielleicht gibt es irgendwann eine Zusammenarbeit ;) , oder Einer klaut einfach geschickt vom Anderen. So wäre die Spec-Datei im VCS-Root [3] ebenso gut aufgehoben. Auf jeden Fall sollte jeder PHP-Entwickler ein Blick darauf werfen. Ein verbreitetes Paketmanagement, was auch noch auf bewährten Techniken aufsetzt, fehlt PHP mE noch.

Update 1

Entgegen meiner Aussage, mit Pearfarm sei nur die MIT-Lizenz möglich, kann man auch eigene Lizenzen setzen. Das ist allerdings ein “undocumented Feature”, was sogar der Entwickler selbst vergessen hat. Dazu muss man in der Spec-Datei die Lizens als assoziatives Array übergeben.

$spec->setLicense(array('name'=>'LGPL','uri' => 'http://www.gnu.org/licenses/lgpl.txt'));

Find ich persönlich nicht sooo elegant. Insgesamt ist der Quellcode des CLI-Tools recht spannend :D

[1] Übigens über Komponenten aus dem Zend Framework realisiert ;)
[2] Vorher muss man einmalig allerdings ein pearfarm keygen einen öffentlichen SSH-Schlüssel erzeugen, den man im eigenen Account hinterlegt.
[3] Vgl zum Beispiel .gitignore, die in der Regel auch versioniert werden.

Schade eigentlich, Version-Control-Plugins für Eclipse find ich immer sehr praktisch. Nach einem Kommentar vom 13.10. kam es, wie es kommen musste: Auch bei mir streikte erneut ein Repo auf Github, zwar mit etwas anderer Fehlermeldung, aber mit gleichem Effekt. Bei der erneuten Suche nach einer erneuten Lösung, die ohne Neu-Anlegen auskommt, stieß ich immer wieder auf den Namen “Egit” als Schuldigen. Es ist zwar normalerweise nicht meine Art eine Software kategorisch abzulehnen, aber was hilft ein Entwicklungstool, was die Entwicklung unbrauchbar macht?
Also zurück zur Kommandozeile. Wer damit Schwierigkeiten hat, der kann sich mal Githubs Guides anschauen (alternativ im alten Wiki). Die sind auch deshalb empfehlenswert, weil sie mehr Git selbst, als Github beschreiben, man braucht also nicht unbedingt dort ein Konto, um sie gut zu finden.

Nun ist schon etwas Zeit ins Land gestrichen und manch einer mag sich vielleicht gefragt haben, wieso ich PHP5.3 noch nicht erwähnt habe, wo ich doch vorher in der Beta Phase gerne mal einen Beitrag darüber verfasst habe. Die größte und am meisten bejubelte Neuerung mag ich nun garnicht weiter erläutern, denn zum Beispiel Blackflash hat dazu 3 Links gesammelt, die das schon ausreichend beleuchten. Das Manual tut sein Übriges.

Überhaupt: So euphorisch vor dem Release die Namensräume gefeiert wurden, so ruhig wurde es doch plötzlich danach. Die Frage ist nun auch nicht wie man damit etwas macht. Die Frage nun lautet, wie man damit irgendwas besser, als vorher umsetzen kann.

(weiterlesen…)

Weil ich schon eine Weile nichts mehr gebloggt habe, möchte ich euch jetzt mal schnell etwas Vorstellen. Bei Piwik handelt es sich um ein “Open source web analytics”-Tool oder kurz — so bezeichnen sie sich selbst — als “open source alternative to Google Analytics“.

GA hab ich selbst nie verwendet, aber mir ging es schon auf die Nerven, wenn bei Aufruf x-beliebiger Seiten immer auch mit Google kommuniziert wird; Wenn ich eine Seite besuche, dann reicht es, wenn die davon wissen. Anders herum hat man auch als Seitenbetreiber wenig Einfluss auf das, was Google damit so anstellt.

Piwik stellt sich nun der Konkurrenz (seit 1.5 Jahren ;) ). Am Besten erkennt man die Bedienung und den Funktionsumfang über die hauseigene Demo, weswegen ich darauf garnicht weiter eingehe. Es arbeitet mit PHP und Javascript und läuft voraussichtlich meist auf den System, auf dem auch die zu überwachende Seite liegt, kann allerdings auch mit verschiedenen Seiten umgehen. So muss man auch nicht immer seine Besucher darauf hinweisen, dass seine Daten verschleudert werden.

Der voll Funktionsumfang hat sich mir bisher nicht offenbart, dafür hatte ich seit gestern Abend zu wenig Besucher ;) und ausserdem fehlt mir natürlich der Vergleich zum Vorbild. Besonders spannend finde ich allerdings den auf Adobe Air-basierende Desktop Web Analytics-Client. Dieser ist sehr hübsch anzusehen ;) Voreingestellt ist auch hier bereits die oben erwähnte Demo, wenn man es sich erstmal in Ruhe anschauen möchte.

Die Installation von Piwik selbst gestaltete sich als relativ idiotensicher, zumindest wenn man die Requirements erfüllt. Unterstützt wird nämlich einzig und ausschließlich der PDO_MYSQL-Treiber, was Schade ist, da Piwik (bei genauerer Betrachtung) auf dem Zend Framework basiert .. bloss in der hoffnungslos veralteten Version 1.0. Hat man die Anforderung erfüllt, klickt man sich durch die 5 oder 6 Schritte, wobei man brav die Fragen beantwortet oder den Aufforderungen nachkommt. Am Ende darf man die erste Seite bekannt geben und bekommt prompt den Javascript-Code zum Einbinden. Das wars dann auch schon, bei mir waren es effektiv 15min, real leider um die 2h, weil ich erstmal den Treiber aktivieren lassen musste :(

Danach muss man einfach warten. Nach der Erstinstallation ist Piwik erstmal richtig langweilig, weil man nichts sieht. Schön wäre vielleicht noch eine Möglichkeit für Imports, zB von GA, falls möglich. Oder vielleicht gibt es das ja auch schon. Vom subjektiven Eindruck ist Piwik einfach klein und schnuckelig. Es lässt sich gut bedienen und stellt die Daten anschaulich da. Kurz: Mir gefällts.

Nur so ganz nebenbei ist dies auch mein erster Beitrag verfasst mit ScribeFire. Mal sehen, ob es sich rentiert ;)

Wie schon angedeutet habe ich beschlossen einen eigenen Adapter für Zend_Translate zu schreiben. Den Namen habe ich jetzt Ben R. zu verdanken ;) : “XML Translation Source”, oder kurz “XTS”.

(weiterlesen…)

  • Über Zeugs: “Entliehen” von USA erklärt (zB hier), viele Sachen sind einfach eines ganzen Themas nicht wert. “USA erklärt” ist übrigens ein wunderbar geschriebenes Blog für jeden, wer sich etwas offener gegenüber der amerikanischen Kultur zeugen möchte. Der Sprachstil macht zumindest Spass.
  • Über Spam: Seit dem 21.07. um 2Uhr hat Bad Behaviour zwischenzeitlich bis zu 11114 Zugriffe in 7 Tagen blockiert. Mittlerweile sind diese aber auf etwa ein Zehntel gesunken. Schön, auch Botnetzwerke sind lernfähig.
  • Über Namespace: Jetzt ist es geschehen, PHP hat doch tatsächlich Namespace-Unterstützung erhalten. Bleibt nur noch zu hoffen, dass sich PHP5.3 in naher Zukunft durchsetzen kann, damit man dieses neue, tolle Feature auch einsetzen kann. Was ich mich allerdings noch frage ist, wie man denn jetzt seinen Code strukturiert. Natürlich kann man so weitermachen, wie bisher, bloss dass nun die Klassenbezeichner auffällig kürzer werden. Meines Erachtens wird man damit dem Konzept — gerade in Hinblick auf anderen Sprachen, die es schon länger implementieren (vgl Python Modules) — nicht gerecht. Eigentlich wäre dies auch ein guter Zeitpunkt Funktionen und Konstanten wieder für sich zu entdecken.
  • Über Setter-Methoden: Ja, quasi eine Erweiterung des letzten Themas, jetzt bloss etwas, worüber man nachdenken darf, während man schlaflos gegen die Decke starrt. Was sollte eigentlich eine Setter-Methode zurück geben? Als da wären:
    1. Das Objekt selbst, Fluent Interface: Ja, nicht jedermanns Sache, führt sie doch gerne mal zu abstrakten/abstrusen Aufrufketten.
    2. Den alten Wert: Nagut, wenn mans braucht… Falls mans braucht … Wieso setzt man einen neuen Wert, wenn man den alten Wert haben will?
    3. Den neuen Wert: Kenn ich doch schon…
    4. Den Erfolg der Zuweisung: Eigentlich hinfällig seit Erfindung der Exception
    5. Nichts: Semantisch perfekt, bloss recht schweigsam…
    6. Was vergessen?!?

    Das ergänzt sich übrigens wunderbar zu der Frage, warum Getter keine Parameter haben sollten. Ich glaube, ich finde Variante 2) aus dem alten Beitrag doch ganz cool.

  • Link tagdocs.de: Grob zusammengefasst gibt es hier Beiträge zu Software im Webbereich, die einen Entwickler das Leben erleichtern können, wenn man gerade sowas gesucht hat. Den Link hab ich aus der aktuellen c’t ;)
  • Link PHPAnywhere: Über tagdocs.de fand ich dann auch direkt PHPAnywhere, ein Browserbasierter PHP-Editor. Ich werd es mir mal anschauen.
  • Link phphatesme.com: Auch schnell erklärt. Ein mittlerweile 1 Jahr altes, deutsches Blog über PHP, was aber hier und da auch mal über den Tellerrand hinaus schaut. Einmal fand es schon Erwähnung in meinem Beitrag über Getter und Setter.
  • Über Farben: Gerüchteweise ist das übliche Farbschema “Schwarz auf Weiß” nur kulturell bedingt. Wie sollte man früher auch schwarzes Papier und weiß-schreibende Stifte herstellen? Gesünder, weil weniger anstrengend für die Augen, ist allerdings “Weiß auf Schwarz”, so heißt es. Verstellt man nun sein Farbschema am PC gibt es eine böse Überraschung: Viele Webseiten setzen die Farbangaben nicht für alle Elemente konsequent um. Bei mir sind zum Beispiel die Input-Elemente in WordPress schwarz … als einziges Element … und auch nicht bei allen Inputfeldern. Auch beliebt ist “Schwarz auf Schwarz”, wenn der Hintergrund zwar gesetzt wird, die Schriftfarbe allerdings nicht. Als einzige Lösung blieb nur das Überschreiben der Farbangaben zu verbieten. Macht zwar ein ziemlichen Einheitsbrei aus den Seiten, hat aber auch den Vorteil, dass jede Seite irgendwie gleich aussieht. Achja, es schont die Augen wirklich :)

Bad Behavior has blocked 53 access attempts in the last 7 days.