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.
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
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
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.
- 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.
- Ist ein Benutzer eingeloggt, soll seine – so vorhanden – eingestellte Sprache verwendet werden
- 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
- 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 ..

Wordpress 3.0
Gestern wurde nun schließlich nach dem Release Candidate 3 die Final Release Version veröffentlicht! Neben der angekündigten Integration von WordPress MultiUsers, gibt es eine Hand voll neuer Features: Dynamische Menus, Zentrale Updates von Plugins und WordPress selbst, individuelle Headers für Artikel und vieles mehr.
Weiterlesen ..
Für all diejenigen, die gerade kein entsprechendes Tool (IDE o.ä.) zur Hand haben, hier ein kleiner Befehl zum Zählen der Lines of Code eines Projektes:
echo 'Lines of code (without spaces): '
find . -path -prune -o -print | egrep '\.php|\.as|\.sql|\.css|\.js' | grep -v '\.svn' | xargs cat | sed '/^\s*$/d' | wc -l
echo 'Lines of code (all): '
find . -path -prune -o -print | egrep '\.php|\.as|\.sql|\.css|\.js' | grep -v '\.svn' | xargs cat | wc -l
Der Befehl wird jeweils im aktuell ausgewählten Verzeichnis ausgeführt und zählt oben aufgeführte Dateitypen rekursiv in allen Unterverzeichnissen. Viel Spaß
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 ..
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 ..
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.
Ich bin schon immer ein Fan von Steinzeit-EDV und großen Anhäufungen rechnender Elektronik gewesen. Hier habe ich einfach mal ein paar nette Youtube-Links zusammengestellt, über die ich kürzlich gestolpert bin. Viel Spaß
Kristian
Wie ich soeben über Heise erfahren habe, wurde eine kritische Sicherheitslücke im Typo3 Core entdeckt. Dabei handelt es sich um eine Sicherheitslücke, die als “highly critical” eingestuft wurde. Die Sicherheitslücke ermöglicht es Hackern in der Typo3-Installation PHP-Code aus einer externen Quelle auszuführen, was im Prinzip vollen Zugriff auf das System erlauben kann.
Betroffen sind die Typo3-Versionen 4.3.0, 4.3.1, 4.3.2 und Entwicklungs-Snapshots aus dem 4.4-Branch. Allerdings müssen folgende Konfigurationen am Server aktiviert sein:
- register_globals
- allow_url_include
- allow_url_fopen
Standardmäßig sollte register_globals sowieso “off” sein, wer das aber dank Hoster nicht ändern kann, sollte möglichst schnell mit diesem in Kontakt treten oder entsprechende Patches installieren. Diese finden sich im offiziellen Security Bulletin von Typo3: Typo3 security bulletins.
Wer sich nicht sicher über entsprechende Konfigurationseinstellungen ist, kann diese ganz einfach über ein
einsehen. Einstellungen, die das Auslesen von Daten externer Server ermöglichen oder ein aktiviertes register_globals sind sowieso mit größter Vorsicht zu genießen und nicht zu empfehlen, wenn sie nicht unbedingt benötigt werden.