Optimierter Array-Zugriff
- PHP 5.4: Optimierte Version
- Optimierter Array-Zugriff
Optimierter Array-Zugriff In PHP 5.4 gibt es einen optimierten Zugriff auf Elemente eines Arrays. Das folgende Beispiel zeigt eine Klasse, die eine Funktion ArrayRueckgabe enthält. In dieser wird ein einfaches Array mit nur einem Element definiert, das den Namen test sowie den Wert meinWert enth...
Optimierter Array-Zugriff
In PHP 5.4 gibt es einen optimierten Zugriff auf Elemente eines Arrays. Das folgende Beispiel zeigt eine Klasse, die eine Funktion ArrayRueckgabe enthält. In dieser wird ein einfaches Array mit nur einem Element definiert, das den Namen test sowie den Wert meinWert enthält.
class MeineKlasse {
public function ArrayRueckgabe() {
return array('test'=>'meinWert');
}
}
Bis jetzt hat der Zugriff auf ein solches Array über eine Variable geführt, die den Rückgabewert der Funktion speichert. Dieses neue Array - im Beispiel mit dem Namen ergebnis versehen - können Sie wie gewohnt adressieren. Für diese Aktion sind allerdings drei Schritte notwendig.
$MeineKlasse = new MeineKlasse();
$ergebnis = $MeineKlasse->Array
Rueckgabe();
echo $ergebnis['test'];
Sie erzeugen im ersten Schritt eine Instanz der Klasse MeineKlasse, über die Sie anschließend auf die enthaltene Funktion zugreifen. Das Ergebnis meinWert geben Sie über einen echo-Befehl aus.Mit der neuen Variante innerhalb von PHP 5.4 können Sie sich den Zwischenschritt über die Variable $ergebnis sparen. Sie erzeugen nur noch eine Instanz Ihrer Klasse MeineKlasse und greifen über diese anschließend direkt auf den Rückgabewert der Funktion zu. Dies wird durch eine Verkettung von Funktionsaufruf und Feldselektion realisiert. PHP verwendet für diese Funktion den Begriff "Array Dereferencing".
$MeineKlasse = new MeineKlasse();
echo $MeineKlasse->ArrayRueckgabe()
['test'];
Der Rückgabewert dieses Beispiels ist, wie im Beispiel zuvor, die Zeichenkette meinWert.
Optimierung der MySQLi-Abfrage
Eine weitere Optimierung im Zugriff auf Elemente ist die Schnittstelle Traversable innerhalb der Klasse MySQLi Result. Mit einem einfachen Einzeiler erzeugen Sie eine SQL-Abfrage samt Ergebnisobjekt, die Sie anschließend mit Hilfe einer foreach- Schleife weiterverarbeiten können.
$m = new mysqli('localhost',
'benutzer', 'passwort', 'datenbank');
if($ergebnis = $m->query("SELECT *
FROM meineTabelle;")){
foreach($ergebnis as $zeile){
print_r($zeile);
}
$ergebnis->close();
}
$m->close();
Sie erzeugen wie gewohnt als erstes ein Zugriffsobjekt auf Ihre Datenbank mit dem Hostnamen, Benutzer, Passwort sowie dem Namen der Datenbank. Die eigentliche Neuerung erfolgt in der zweiten Zeile, in der Sie eine Variable definieren und diese direkt mit einer Abfrage verknüpfen. Ergibt die Abfrage ein sinnvolles Ergebnis, so wird dieses anschließend direkt über die foreach-Schleife verarbeitet.
Kapselung von PHP-Code
Es gibt eine Reihe von unterschiedlichen Optionen, wie Sie PHP-Code vom umgebenden Code abheben und trennen können. Im Falle von HTML geschieht dies in der Regel durch den Kennzeichner <?php. Dieser wird auch von den meisten anderen Systemen verwendet und problemlos erkannt.
Download von PHP 5.4
Darüber hinaus gibt es auch noch die Kurzform dieses Kennzeichners, der auf die Kennung php einfach verzichtet und nur aus einer Klammer sowie einem Fragezeichen besteht. Diese Kurzform können Sie bereits heute über die php.ini-Datei deaktivieren, da es teilweise zu Problemen kommt, wenn Sie PHP-Code in XML-Dokumente integrieren, die Anweisungen zum Ausführen des XML-Codes beinhalten.Aktuell gibt es zusätzlich noch als weitere Kurzform <=?, welche ausgeschrieben dem Tag <php echo entspricht. Diese Kurzform wird gerne eingesetzt, wenn Sie PHP als Template-Sprache verwenden und Daten ausgeben möchten.Durch die kompakte Form bleibt die Übersichtlichkeit des Programmcodes erhalten. Innerhalb der Versionen vor PHP 5.4 besteht jedoch das Problem, dass dieser Kurzbefehl an short_open_tags gebunden ist. Damit kann es gerade bei portablen Anwendungen unter Umständen zu Problemen kommen. Dies wurde in PHP 5.4 gelöst und <?= steht immer zur Verfügung, unabhängig von short_open_tags.
Eingebauter Webserver
Zum Test all dieser Funktionen benötigen Sie in einem Entwicklungsumfeld künftig nicht mehr zwingend einen vollwertigen Webserver, wie beispielsweise den Apache Server. Ab Version 5.4 kommt PHP mit einem integrierten Webserver, den Sie für Ihre Tests heranziehen können. Bei der Verwendung gilt es eine Reihe von Faktoren zu beachten:
- Die URI-Anfragen werden aus dem Verzeichnis bedient, in dem PHP gestartet wurde. Mit dem Parameter -t können Sie einen alternativen Pfad für das Startverzeichnis Ihrer Dokumente angeben.
- Wird lediglich eine Pfadangabe ohne Dateinamen angefragt, versucht der Webserver entweder die Datei index.html oder index.php auszuführen und darzustellen. Werden beide Dateien nicht gefunden, erhalten Sie eine 404-Fehlermeldung zurück.
- Eine Spezialität dieses Webservers ist der Einsatz eines speziellen Routerskripts, das vor der Ausführung einer jeden https-Anfrage genutzt wird. Gibt dieses Skript den booleschen Wert FALSE zurück, erfolgt die Ausführung der Seite wie geplant. In allen anderen Fällen wird die Ausgabe des Skripts an den Browser übergeben.
Sie starten den Webserver aus dem PHP-Unterverzeichnis public_html heraus über den Befehl
php -S localhost:8000.
Als Rückgabewert erhalten Sie die Startmeldung des Webservers, den Port, der durch ihn überwacht wird, sowie eine Referenz auf das Dokumentenverzeichnis.
PHP 5.4.0beta1 Development Server
started at Thu Oct 20 06:06:52 2011
Listening on localhost:8000
Document root is C:\Users\andreas.
hitzig\Downloads\php-5.4.0b1
Press Ctrl-C to quit.
Wenn Sie anschließend eine Website über den Browser aufrufen, werden die notwendigen Aktionen direkt in der Kommandozeile durch den Webserver dargestellt.
Aufruf mit Parametern
Wie bereits beschrieben, können Sie auch ein alternatives Dokumentenverzeichnis beim Aufruf des Webservers mitgeben. Im folgenden Beispiel wird das Verzeichnis /php_beispiele unterhalb des Dokumentenverzeichnisses verwendet. Der Aufruf lautet entsprechend
php -S localhost:8000 -t
php_beispiele
In der Rückmeldung vom Webserver sehen Sie anschließend die aktive Verknüpfung des Verzeichnisses php_beispiele.
PHP 5.4.0beta1 Development Server
started at Thu Oct 20 06:09:54 2011
Listening on localhost:8000
Document root is C:\Users\andreas.
hitzig\Downloads\php-5.4.0b1\php_beispiele
Press Ctrl-C to quit.
Der Aufruf der Datei beispiel1.php erfolgt anschließend direkt aus dem Verzeichnis php_beispiele.Zusätzlich oder alternativ können Sie beim Aufruf des Webservers auch eine Routerdatei mitgeben. Diese kann beispielsweise abhängig von der Art der aufgerufenen Datei unterschiedliche Folgeaktionen festlegen. Im Beispiel wird für die Grafikformate PNG, TIF, JPG, JPEG und GIF sowie das Musikformat MP3 und das Dokumentenformat PDF direkt eine Ausgabe der Datei veranlasst, bei allen anderen Fällen sehen Sie lediglich die Meldung "Es grüßt Sie herzlich die Router-Datei".
<?php
if (preg_match('/\.(?:png|jpg|jpeg|
gif|tif|mp3|pdf)$/', $_SERVER["REQUEST_URI"]))
return false;
else {
echo "<p>Es grueßt Sie herzlich die
Router-Datei</p>";
}
Time to say Goodbye
Es sind jedoch nicht nur neue Funktionen hinzugekommen und Fehler beseitigt worden, einige Funktionen stehen in PHP 5.4 auch nicht mehr zur Verfügung. Der wohl bekannteste Vertreter sind die "Magic Quotes", also die magischen Anführungszeichen. Bis PHP 5.4 war die folgende Abfrage zulässig und wurde verarbeitet.
<?php
$q = mysql_query("SELECT * FROM
meineTabelle WHERE name = '$wert1' ");
?>
Mit Hilfe von register_globals können Sie zumindest das Einschleusen von externem Code verhindern und somit eine sichere Quelle der Daten sicherstellen. Selbst wenn diese Gefahr von außen gebannt wurde, hat die Umsetzung der Escape-Sequenzen jedoch nicht in allen Fällen zufriedenstellend funktioniert. Bekanntermaßen gibt es Probleme bei Werten, die keine Zeichenketten sind oder auch bei datenbankspezifischen Escape-Sequenzen. Die folgende Abfrage führt in der Regel zu einem Fehler, da die Umsetzung der Variablen $id nicht funktioniert.Vor allem für portable Anwendungen besteht aufgrund der Magic Quotes ein erhöhter Aufwand zur Code-Validierung: Es muss zuerst überprüft werden, welchen Wert die Variable magic_quote_gpc besitzt. Anschließend steht noch eine Validierung der Zeichenkette durch Ersetzen der Anführungszeichen und Umsetzen der Escape-Sequenzen an. Ansonsten kann es teilweise zu Problemen bei der Ausführung der Abfragen und unter Umständen auch zu Programmabstürzen kommen.Die Entwickler der kommenden Version PHP 5.4 Version haben dies pragmatisch gelöst und die Magic Quotes wieder abgeschafft. Damit sind für künftige Entwicklungen diese Probleme aus der Welt. Lediglich bei Altanwendungen müssen Sie vor der Migration auf PHP 5.4 überprüfen, ob diese Funktion zum Einsatz kommt, und sie gegebenenfalls ersetzen.
Fazit
Dies war nur ein Ausschnitt aus den Neuerungen der kommenden PHP-Version. Darüber hinaus gibt es noch Weiteres zu entdecken, wobei die PHP-Website hierfür ein guter Einstiegspunkt ist. Von den besprochenen neuen Funktionen werden sicherlich die Traits schnell an Beliebtheit gewinnen, da die Vererbung in horizontaler Richtung eine Menge zusätzlicher Arbeit ersparen wird.