__autoload

July 28th, 2008 ron Posted in PHP No Comments »

Eine weitere magic-Function ist die __autoload() Funktion.

Sie ermöglicht das automatische Nachladen von Dateien und soll den Einsatz von inlcude() und require() ablösen. Die Voraussetzung für den Einsatz von __autoload() ist eine objektorientierte Programmierung mit einer klaren und stringenten Strukturierung.

Wird ein Objekt einer Klasse instanziiert, welche nicht eingebunden ist, wir die __autoload()-Funktion aufgerufen, gleiches gilt für extends und implements. Als Parameter bekommt Sie den Klassennamen übergeben.

function __autoload($s_klassenname)
{
    require($s_klassenname.'php');
}

Aus dem übergebenen Klassennamen werden nun entsprechend der Programmierung der Funktion der Pfad und der Name der zu inkludierenden Quelldatei genieriert und diese eingebunden.

Hierbei muss der Programierer dafür Sorge tragen, dass dies nicht zu unerwünschten Ergebnissen führt, so kann zum Beispiel bei mangelhafter Prüfung auch eine URL übergeben und so eine Datei von einem fremden Server inkludiert werden, was eine nicht unterhebliche Gefährdung der Webanwendung nach sich zieht.

Hier sind also die üblichen Vorsichtsmaßnahmen zu treffen: Gültigkeitsprüfung mit Regulären Ausdrücken, Existenzprüfung z.Bsp. mit file_exists() und Kontrolle, ob die einzubindende Datei auch die Klassendefinition enthält class_exists().

try
{
    if(FALSE === RegEx)
    {
        throw new Exception("Klassenname $s_klassenname ist ungültig");
    }
    else
    {
        require_once($s_klassenname);
    }
}
catch(Exception $e)
{
    die($e->getMessage());
}

Diese Art der Programmierung erfordert jedoch ein hohes Maß an Organisation, durch unbedachtes Bennenen von Dateien und Klassen kann die Fehlersuche deutlich erschwert werden. Außerdem muss darauf geachtet werden gewissen Konventionen beim Anlegen und Verwenden von Pfaden eingehalten werden, die jedem Programmierer in einem Projekt bekannt sein müssen. Auch in Hinblick auf die möglichen Sicherheitsimplikationen sollte die Verwendung von __autoload() gut überdacht werden.

AddThis Social Bookmark Button

UTF-8 Probleme

July 25th, 2008 ron Posted in PHP 3 Comments »

Manchmal kommt man mit utf8_decode nicht weiter, zum Beispiel dann, wenn man nicht weiß, in welchem Format die Daten angeliefert werden, und diese sowohl in UTF8 als auch in ISO-8859-1 hereinkommen können. Es passiert zum Beispiel manchmal bei Eingabefeldern in Webseiten, dass ein Browser UTF8-Daten schickt, obwohl die Seite in ISO ausgeliefert wurde.
Würde man nun einfach alle hereinkommenden Daten mit utf8_decode bearbeiten, käme es zuweilen zu seltsamen Ergebnissen.

Da ist es manchmal einfach sinnvoller mit”Suchen und Ersetzen” zu arbeiten.

Dieses kleine Codesnippet does the trick:

< ?php

       $trans = array("ä" => "ä", "Ä" => "Ä", "ü" => "ü", "Ü" => "Ü", "ö" => "ö",
      "Ö" => "Ö", "ß" => "ß");
      $string = strtr($string, $trans);
?>

So wird sichergestellt, dass am Ende auch wirklich die Umlaute herauskommen, die man haben wollte.

AddThis Social Bookmark Button

__toString

July 17th, 2008 ron Posted in PHP No Comments »

Die __toString Methode wird immer dann Aufgerufen, wenn man ein Objekt mit echo oder print ausgibt. Was die Funktion machen soll muss man dann natürlich selbst implementieren. Ab PHP 5.2.0 erfolgt dieser Aufruf in jedem Stringkontext (z.B. in printf() mit %s Platzhalter) aber in keinem der anderen Typenkontexte (z.B. mit dem %d Platzhalter). Ebenfalls ab PHP 5.2.0 bewirkt die Umwandlung eines Objekts ohne __toString Metohde in einen String einen Fehler der Klasse E_RECOVERABLE_ERROR.

Bsp:

 <?php
    class car
    {
        public function __toString()
        {
            return "This is a nice car\n";
        }
    }
     $fiat = new car;
     echo $fiat;

?>

>This is a nice car

Ohne eine __toString() Methode gibt PHP nur die Object ID aus, womit sich nicht wirklich viel anfangen lässt.

AddThis Social Bookmark Button

Magische Funktionen

July 13th, 2008 ron Posted in PHP 2 Comments »

Magische Funktionen wurden als ein Teil des verbesserten Objekt-Models in PHP 5.1 eingeführt. Sie werden magisch genannt, weil sie nicht direkt aufgerufen sondern durch andere Aktionen aktiviert werden. Bei der Einführung von PHP 5.1 gab es folgende magische Methoden:

__construct, __destruct, __toString, __autoload, __call, __clone, __get, __set, __sleep, __wakeup, __unset und __isset

Manche dieser magischen Methoden sind wichtig, andere stellen jedoch nur eine nette “Beigabe” dar. Während einige Methoden ziemlich selbsterklärend und leicht handhabbar sind, benötigen andere eine eingehendere Betrachtung.

__construct

und

 __destruct

Während in PHP4 der Konstruktor einer Klasse noch den gleichen Namen, wie die Klasse selbst haben musste, kann in PHP 5.1 die magische Methode

__construct()

verwendet werden. Im Endeffekt war damit der alte Konstrukter auch schon “magisch”, er wurde ja automatisch aufgerufen, wenn man ein neues Objekt der Klasse erstellt hat. Insofern ist es eher eine logische Vereinheitlichung, den Konstrukter durch die zwei Unterstriche auch als magische Funktion zu kennzeichnen. Zudem kann man jetzt den Namen der Klasse einfach ändern, ohne den Konstruktor anpassen zu müssen. Außerdem erlaubt er ein leichteres Aufrufen des Parent-Konstruktors einer abgeleiteten Klasse -

parent::__construct()

Der Destruktor stellt das Gegenstück zum Konstruktor dar. Er ist dafür zuständig, dass beim Löschen eines Objektes gewissen Aufräumarbeiten, wie das Schließen von Dateien oder Datenbankverbindungen durchgeführt werden.
Zwar ist PHP sehr sorgsam beim Aufräumen und schließt beim Beenden von Skripten selbständig offende Deskriptoren, jedoch kann man durch explizites Ausprogrammieren weitere Arbeiten verrichten lassen, die ausführt werden sollen, wenn ein Objekt den Speicher verlässt.

AddThis Social Bookmark Button

Patterns

July 9th, 2008 ron Posted in PHP No Comments »

Ein Pattern beschreibt ein Problem im Software-Design und bietet zugleich die Lösung. Mit Lösung ist hier jedoch nicht das Verfahren gemeint, welches einem die vielen Cookbooks anbieten. Ein Design-Pattern ist nicht die Cut and Paste Lösung für ein Problem, sondern es zeigt einen standardisierten Lösungsansatz für immerwiederkehrende Problemstellungen auf. Auch wenn man Beispiellösungen finden mag, so geht es doch um das Konzept der Lösung. Patterns folgen meist gewissen Kern-Prinzipien, was das Design angeht. Das Verständnis dieser Prinzipien hilft nicht nur bei der Analyse der Patterns sondern auch bei ihrer Adapation auf die täglichen Programmierungen.

Allgemein gesprochen ist ein Pattern ein Entwurfsmuster, eine Lösungs-Schablone für ein wiederkehrendes Entwurfsproblem. Es ist somit eine immer wieder zu verwendende Vorlage für bestimmte Problemstellungen.

Entwurfsmuster lassen sich in Klasseneinteilen:

  • erzeugende Muster
  • strukturelle Muster
  • Verhaltensmuster
  • weitere Muster

Auch in PHP setzen sich Design-Patterns immer mehr durch. Dies gilt zumindest für den Bereich der objektorientierten Programmierung.

Einige der bekannteren Patterns:

  • Singleton Pattern
  • Factory Method Pattern
  • Abstract Factory Pattern
  • Observer Pattern
  • Visitor Pattern
  • Command Pattern

Um Patterns zu verstehen, sollte man mit der objektorientierten Programmierung bereits gut vertraut sein.

Ein ganz trivialer Grund, warum Patterns so beliebt sind, ist die simple Tatsache, dass jeder Programmierer früher oder später auf die selben Probleme trifft, wie tausende andere Programmierer vor ihm. Wie auch der Autobauer nicht jedes Mal das Rad von neuem erfindet, kann auch jeder Programmierer vom Wissen seiner Vorgänger oder Mitstreiter profitieren. Neben der Lösungsvorlage für gewisse Probleme bieten Patterns darüberhinaus eine Art gemeinsamer Sprache unabhängig von der Programmiersprache selbst.

Daher denke ich, dass ich mich hier bei Gelegenheit mehr über diese faszinierende Facette der Programmierung auslassen werde.

AddThis Social Bookmark Button

Euro € Zeichen mit chr() in PHP

May 19th, 2008 ron Posted in PHP No Comments »

Kleine Merkhilfe

string chr ( int $ascii )

Gibt einen Ein-Zeichen-String zurück, der dem angegebenen ascii -Wert entspricht.

Um nun ein € Zeichen zu erhalten muss man lediglich chr(128) ausgeben.

AddThis Social Bookmark Button

Fatal error: Cannot clone object of class SimpleXMLElement due to zend.ze1_compatibility_mode

January 22nd, 2008 ron Posted in PHP 2 Comments »

Der Kompatibilitätsmodus von Zend soll eigentlich helfen PHP4 Scripte unter PHP5 laufen zu lassen, doch kann er auch PHP5 Scripte in ihrer Funktion beeinträchtigen.

Nachdem ich bei einer älteren vTiger Installation einige PHP5 Funktionen verwenden wollte kam es zu unerwarteten Problemen, unter anderem verursachte der Versuch, ein SimpleXMLObjekt zu erzeugen die Meldung: Fatal error: Cannot clone object of class SimpleXMLElement due to zend.ze1_compatibility_mode.

Eine selbstgeschriebene Fehlerklasse, in der ein Objekt über ein Singleton-Pattern erzeugt wird warf nur bei der Einbindung der Klasse schon fünfzig mal eine Exception, weil versucht wurde das Objekt zu klonen, was ja nicht erwünscht ist.

Um hier Abhilfe zu schaffen, kann man entweder in der php.ini den Kompatibilitätsmodus von Zend ausschalten, was aber zu negativen Effekten in den PHP4 Skripten führen würde.

Die andere Möglichkeit ist, mit der Zeile

php_admin_flag zend.ze1_compatibility_mode Off

in der vhost.conf des Apache den Wert zu ändern. Was aber im Endeffekt die gleichen Probleme mit sich bringt, wenn auf diesem vHost PHP4 Skripte laufen sollen.

Die beste Möglichkeite ist, den Kompatibilitätsmodus von Zend direkt in den betreffenden Skripten auszuschalten. Dies erfolgt einfach direkt im Skript, solange die Funktion ini_set erlaubt ist. Dazu muss man nur in den Kopf des Skripte die Zeile

ini_set (’zend.ze1_compatibility_mode’, 0);

einfügen. Danach laufen die PHP5 Funktionen ohne weitere Probleme.

AddThis Social Bookmark Button

CDATA mit PHP 5.1 und SimpleXML verarbeiten

December 11th, 2007 ron Posted in Code, PHP No Comments »

Weil ich kürzlich darüber gestolpert bin, dass ein XML-Dokument einen CDATA-Abschnitt enthielt, der weiterverarbeitet werden sollte und dieser aber von SimpleXML nicht zurückgeliefert wurde:

simplexml_load_string($xmlraw, ‘SimpleXMLElement’, LIBXML_NOCDATA);

Dies funktioniert seit der PHP Version 5.1.0. Alle früheren Versionen ignorieren < ![CDATA[…]]> Abschnitte im XML-File.

Mehr Informationen zu den LibXML-Funktionen gibt es hier.

AddThis Social Bookmark Button




Amazon Bookshop