PHP hasst mich: Verzeichniswechsel in Destruktoren30 Aug

Von Julian am 30.08.2010. Es wurde noch kein Kommentar hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

Nils Langners Blogname lässt sich leider nur zu oft zitieren. Diesmal geht es (mal wieder) um Eigenheiten von Destruktoren. Die machen mir nämlich mein schönes Autoloading kaputt.
Da hat man sich solche Mühe mit einer netten Autoloading-Methode gegeben, ohne auf set_include_path() zurückgreifen zu müssen und nun verhindert ein Destruktor einer schmucken, neuen Klasse eben jenes. Der hat nämlich die Eigenheit in manchen SAPIs das aktuelle Verzeichnis zu wechseln. Zitat von php.net:

Das aktuelle Verzeichnis während der Beendigungsphase des Skripts kann bei einigen SAPIs (z.B. Apache) ein anderes sein.

Betont auf kann. Das kann dann schon mal bitter sein. Denn dann stimmen meine relativen Pfade schon nicht mehr und die Autoload-Methode weiß nichts mit den Namespaces und Klassennamen anzufangen. Schade. Nun darf ich wohl oder übel ein neues Autoloading-Script schreiben und set_include_path() verwenden – halten viele wohl ohnehin für eleganter.

Singleton dank Late Static Binding vererbbar17 Aug

Von Julian am 17.08.2010. Es wurden 3 Kommentare hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

Das bekannte design pattern “Singleton” ist seit PHP 5.3 nun dank Late Static Binding vererbbar. Vorher war das leider nicht möglich. Aufmerksam darauf geworden bin ich dank einem Post auf php.net von Ende 2009.
Anstatt dass man nun bei jeder Klasse einen privaten Konstruktor und eine private Methode __clone() sowie eine getInstance()-Methode definiert, kann man ohne weiteren Aufwand nun eine Unterklasse von einer Klasse Singleton erben lassen. Bisher musste man zumindest die getInstance()-Methode dazu überschreiben.

abstract class Singleton {
    /**
     * Prevents direct creation of object.
     *
     * @param  void
     * @return void
     */
    protected function __construct() {}
 
    /**
     * Prevents to clone the instance.
     *
     * @param  void
     * @return void
     */
    final private function __clone() {}
 
    /**
     * Gets a single instance of the class the static method is called in.
     *
     * See the {@link http://php.net/lsb Late Static Bindings} feature for more
     * information.
     *
     * @param  void
     * @return object Returns a single instance of the class.
     */
    final static public function getInstance() {
        static $instance = null;
 
        return $instance ?: $instance = new static;
    }
}

Jede Klasse, die nun diesem Muster folgt, kann man einfach davon erben lassen:

class A extends Singleton {}
class B extends Singleton {}
class C extends B {}
 
$a = A::getInstance();
var_dump($a);
$a2 = A::getInstance();
echo '<br />';
var_dump($a2);
echo '<br />';
var_dump(($a === $a2));
$c = C::getInstance();
echo '<br />';
var_dump($c);

object(A)#1 (0) { }
object(A)#1 (0) { }
bool(true)
object(C)#2 (0) { }

Und schon gibts weniger Code-Duplikation! Ach übrigens: Singletons sind böse :P Aber manchmal braucht der ein oder andere Entwickler sie wohl doch ..

Viel Spaß

PS: Hier wird sich in nächster Zeit wieder einiges tun. Sind immerhin mal wieder Semesterferien ;)

Language Fallback14 Jul

Von Julian am 14.07.2010. Es wurde noch kein Kommentar hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

Für ein aktuelles, umfangreiches Projekt habe ich letzte Woche ein weiteres Kernsystem fertiggestellt: Ein von mir genanntes “Language Fallback”. Damit bezeichne ich einfach eine Liste oder Stack (oder Array, Queue, ..), zu der beim Ermitteln der Sprache Sprachobjekte hinzugefügt werden und über die man dann später ganz bequem iterieren kann. Im Gegensatz zu üblichen HowTo’s wie beispielsweise selfhtml: PHP: Ermitteln der Sprache des Browsers, an dem ich mich orientiert habe, versucht mein System die vom Benutzer gewünschte Sprache zu ermitteln, im Falle von fehlenden Sprachinformationen aber auf Ausweichsprachen zurückzufallen. Das sind gewöhnlich bis zu vier oder fünf Sprachen, denn der Benutzer kann bereits auf zwei Weisen mehrere Sprachen anfordern: Über den HTTP-Request kann er seine favorisierten Sprachen mitteilen und das sowohl über einen Header, als auch beispielsweise über einen URL-Parameter.

Algorithmisch gehe ich nach einem ganz einfachen Konzept vor.

  1. Die primär favorisierte Sprache wird per URL-Parameter überliefert – beispielsweise $_GET['lang']. Damit ist es möglich, dass sich ein chinesischer Besucher auch lieber die englische Seite ansehen kann. Gleichzeitig erhalten Suchmaschinen auch direkt einen Zusammenhang zwischen Inhalt und Sprache.
  2. Ist ein Benutzer eingeloggt, soll seine – so vorhanden – eingestellte Sprache verwendet werden
  3. Danach folgen die vom Benutzer gesendeten Header, in denen nach HTTP-Spezifikation mehrere Sprachen mit unterschiedlicher Qualität (Favorisierung) mitgesendet werden. Hier sind drei oder vier Sprachen nicht unüblich
  4. Schließlich gibt es noch – für den Fall der Fälle – eine globale default-Sprache des Portals / der Website. Diese greift, wenn keine der vorhergehenden Sprachen verfügbar sind. Beispielsweise, wenn auf mein deutsch-englisch-italienisches Portal von einem Brasilianer mit Spanisch oder Portugiesisch als Alternativsprachen zugegriffen wird.

Weiterlesen ..

AVR-NET-IO meets Heizung25 Mai

Von krisi am 25.05.2010. Es wurde noch kein Kommentar hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

Dank eines freien Tages bin ich in der letzten Woche endlich einmal zu etwas gekommen was ich schon vor Wochen erledigt haben wollte. Das AVR-NET-IO Board hat jetzt eine neue Heimat gefunden. Und zwar im heimischen Heizraum. Seit ein paar Tagen loggt nun der Server in regelmäßigen Abständen sechs verschiedene Temperaturwerte der Heizungsanlage mit und erstellt daraus ein buntes t-Θ Diagramm.

Aus den gewonnenen Daten möchte ich zunächst einmal die Betriebszustände der Anlage sichtbar und auswertbar machen, irgendwann mal kann ich dann über eine Optimierung der Anlagenparameter nachdenken.

Weiterlesen ..

10 php-Spielereien mit Bits08 Mai

Von Julian am 08.05.2010. Es wurden 3 Kommentare hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

Schon oft habe ich mir Gedanken gemacht, wie man im Web verschiedene Ressourcen (vergleichbar mit dem Begriff “Ressource” beim Zend-Framework) für Benutzer beschränken kann – eine Benutzer- und Rechteverwaltung also. Dazu gibt es schließlich vielerlei Ansichten und Lösungen und so viel sei gesagt: Je genauer man einzelnen Personen Rechte zuweisen möchte und je mehr Rechte zur Verfügung stehen, desto mehr Speicheraufwand ist dazu nötig.
Wichtig ist in solchen Zusammenhängen selbstverständlich die Dynamik. Niemand möchte einzelne Rechte hard-coden und im Administrations-Center seines Portals jedes mal eine Funktion is_admin() aufrufen. Besonders bei Community-Portalen gibt es dann so etwas wie einen “Administrator” schon gar nicht mehr, höchstens einen root-Administrator, aber der hat dann sowieso vollen Zugang zum FTP und MySQL. Viel mehr geht es um die Zugangsrechte vieler Benutzer auf allerlei Ressourcen.

Weiterlesen ..

Ubuntu 10.04 Lucid Lynx – Apache bietet php-Dateien zum Download an05 Mai

Von Julian am 05.05.2010. Es wurden 3 Kommentare hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

Gequält habe ich heute den ganzen morgen nach einer Lösung für mein Problem mit php-Dateien seit dem Umstieg auf Ubuntu 10.04 gesucht: Sämtliche Dateien wurden zum Download angeboten. Dass daran das Update auf Ubuntu 10.04 schuld war, war völlig klar. Allerdings bin ich im Web vorwiegend auf ältere Artikel gestoßen, bis ich im UbuntuUsers-Forum auf einen aktuellen Artikel aufmerksam wurde. Dort wird auf einen entsprechenden Hinweis zum Apache-Artikel von UbuntuUsers gegeben, in dem sich ein kleiner Abschnitt mit dem aktivierten Modul mod_userdir unter Lucid Lynx befasst.

Falls PHP Dateien bei Nutzung von mod_userdir ab Ubuntu 10.04 Lucid Lynx heruntergeladen statt angezeigt werden, ist die Datei /etc/apache2/mods-available/php5.conf bzw. /etc/apache2/mods-available/php4.conf wie folgt anzupassen:

<IfModule mod_php5.c>
<FilesMatch "\.ph(p3?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
# To re-enable php in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
#<IfModule mod_userdir.c>
# <Directory /home/*/public_html>
# php_admin_value engine Off
# </Directory>
#</IfModule>
</IfModule>

Die Zeilen von inkl. <IfModule mod_userdir.c> bis inkl. </IfModule> müssen mit Kommentarzeichen (#) versehen werden.

Quelle: http://wiki.ubuntuusers.de/Apache#mod-userdir-ab-Ubuntu-10-04

Nach entsprechender Anpassung der (in meinem Falle) php5.conf war das Problem gelöst.

Ternärer Operator in PHP 5.314 Mrz

Von Julian am 14.03.2010. Es wurde noch kein Kommentar hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

Seit der letzten Jahres erschienen Version 5.3, kann man einen Teilausdruck des ternären Operators weglassen, wenn es der Zusammenhang erlaubt.

Was ist der tenäre Operator?

Der tenäre Operator ist ein Vergleichoperator, der in Versionen vor PHP 5.3 drei Ausdrücke verwendet hat. In vielen Fällen ist es übersichtlicher und angenehmer den tenären Operator anstatt einer Fallunterscheidung via if zu verwenden:

//Wertzuweisung für $var in Abhängigkeit von $bool
if($bool == TRUE){
	$var = 'wahr';
}
else {
	$var = 'falsch';
}
 
$var = $bool ? 'wahr' : 'falsch';

Der tenäre Operator erwartet also drei Ausdrücke: Einen boolschen Ausdruck (kann zum Beispiel auch isset($_GET['request']) sein) und danach einen Wert für den Fall, dass der Ausdruck wahr ist und hinter einem Doppelpunkt folgend, der Wert für den Fall, dass der Ausdruck falsch ist: <bool expr> ? <expr> : <expr>

Weiterlesen ..

postShare – WordPress Plugin04 Mrz

Von Julian am 04.03.2010. Es wurden 5 Kommentare hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

postShare Logo
Download postShare 0.3

Seit Kurzem haben wir nun ja eine Mailingliste für interessierte Leser und Diskussionen rund um Webdevelopment, Serververwaltung, Netzwerke, Linux oder gar Elektrotechnik eingerichtet – alles was bei einer eierlegenden Wollmilchsau wie das GI Project eben so Gesprächsstoff bietet.
Es bot sich also an, aktuelle Artikel auf eben jener Mailingliste anzukündigen, beispielsweise als Alternative zu RSS. Zunächst entstand daraus eine kurz zusammengehackte Funktion, die bei jedem Veröffentlichen eines Blog-Artikels eine Mail versandt hat. Allerdings stolperte ich dann zufällig über Nils Langner pushWP-Plugin und durchstöberte kurzerhand einmal dessen Vorgehensweise und Funktionalität. Von vielen Dingen habe ich mir dann einfach das Prinzip kopiert, jedoch bin ich schon bald auf einige Unstimmigheiten gestoßen, die mir so nicht gefielen.

Weiterlesen ..

Models: Sinnvolles Einsatzgebiet von Singletons entdeckt25 Feb

Von Julian am 25.02.2010. Es wurde noch kein Kommentar hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

Im Web findet man haufenweise Diskussionen um den Sinn von Singletons. Auf Wikipedia finden sich ausführliche Erklärungen zu Singletons. Dabei sind auch haufenweise Nachteile aufgelistet, beispielsweise der Hang zur Erschaffung von Äquivalenten zu globalen Variablen – eben Klassen, die überall zur Verfügung stehen.
Bisher hatte ich auch nur einige wenige sinnvolle Einsatzgebiete entdeckt. In einem ehemaligen Blog habe ich das Singleton-Pattern an Hand einer Klasse beschrieben, die sich ähnlich wie Konstanten verhält, aber viel mehr Speichermöglichkeiten (Arrays, Objekte, ..) bietet. Dadurch ließen sich Konfigurationen ermöglichen, die von einzelnen Komponenten beispielsweise im Programmdurchlauf nicht manipuliert werden dürfen.
Nun bin ich aber während Arbeiten an einigen Komponenten eines aktuellen Projektes auf ein neues Einsatzgebiet gestoßen, das sich sogar nur umständlich ohne Singletons umsetzen lässt: Repositories im Model-Aspekt des MVC-Patterns.

Weiterlesen ..

PHPHatesMe.com – 500. Artikel23 Feb

Von Julian am 23.02.2010. Es wurde noch kein Kommentar hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

PHPHatesMe.com Startseite
Für all diejenigen, die keine eMail-Benachrichtigung erhalten haben: www.phphatesme.com hat gestern den 500. Blog-Artikel veröffentlicht und in diesem Zusammenhang das Blog-Layout erneuert.
Lustigerweise hat Nils nun zwar die 500 Artikel gebührend gefeiert, entsprechende technische Anpassungen immer noch nicht unternommen. So ist die Ideenschmiede immer noch sichtlich einfach manipulierbar. Darüber hinaus hat die Qualität des Blogs in meinen Augen die letzten Monate ziemlich abgenommen. Während früher tatsächlich täglich interessante Beiträge rund um PHP (design patterns, performance tuning, bugs, frameworks, project management, ..) veröffentlicht wurden, sind mittlerweile viele Lücken zu entdecken. Die Beiträge erscheinen nicht mehr täglich (wofür sich der Blog ja einst rühmte) und viele sind lediglich kurze, etwas weniger themenbezogene Artikel. Die Linksammlung und Artikelreihe “Max’ Lesestoff zum Wochenende” wirkt da ebenfalls wie ein Lückenstopfer, der die Leser hinhält.
Jetzt, da PHPHatesMe.com eine sehr starke Popularität in der php-Community erhalten hat, frage ich mich doch, ob das Design und vielerlei Features wirklich einen guten Blog ausmachen, oder ob es nicht doch die qualitativ guten und ausgewählten Beiträge sind.

« vorherige Seite

© 2009 GlobalIndustry-Project Blog