Quantcast
Channel: php – schwarz-weiss.cc
Viewing all articles
Browse latest Browse all 33

PHP 5.4 räumt mit alten Scripten auf

$
0
0

php_elefant

PHP ist meine und bleibt meine Lieblingssprache, auch wenn ich ihr derzeit etwas abtrönnig werde, da ich mit Python spiele.

(Einen seperaten PHP vs Ruby vs Python Beitrag wird es natürlich geben)

Aber jetzt erst einmal zu PHP: Vor kurzem kam eine neue Version ans Tageslicht: 5.4.0. Für mich hat die zwar eher den Anschein wie die mittlerweile für tot erklärte PHP Version 6, ist aber nicht weiter schlimm, denn die Neuerungen die jetzt enthalten sind, werden mit dem doch etwas beschädigten Image von PHP ordentlich aufräumen.

PHP hat hier und da ein paar krude Sprachkonstrukte, die nicht immer einheitlich sind. Nun wird aufgeräumt

1) Discontinued – Entfernte Funktionen

register_globals, magic_quotes, safe_mode
Endlich sind die register_globals draußen! Ich kann mich noch an Zeiten zu PHP4 erinnern, in denen die Funktion ihre Hochzeiten hatte. Dann wurden reihenweise die Lücken in den Scripten ausgenutzt und nach und nach ist die Funktion verschwunden. Doch noch heute gibt es Scripte die damit arbeiten. Zur Erinnerung, das ist register_globals:

< ?php
if ($username) {  // Auswertung erfolgt nach GET/POST/COOKIE
	$good_login = 1;
}

if ($good_login == 1) { // Auswertung erfolgt nach GET/POST/COOKIE
	fpassthru ("/highly/sensitive/data/index.html");
}
?>;

Das wird ein Freudenfeuer werden wenn die ersten feststellen, dass das Script von 1900 nicht mehr funktioniert weil es nur mit register_globals arbeitet.

Zudem wurde safe_mode und magic_quotes rausgeworfen. Gerade mit safe_mode wird eine Funktion entfernt die alles andere als safe war und viele sich darauf verlassen haben, dass mit aktivem safe_mode ja alles sicher wäre. Weit daneben. (Das ist übrigens ein Punkt der mir an Python besser gefällt: Dort wird man als Entwickler nicht vor sich selbst geschützt sondern wie ein Erwachsener behandelt).

Das sind meines Erachtens die stärksten Einschnitte in die Kompatibilität mit alten PHP Scripten. Ich freu mir trotzdem, dass endlich die Altlasten rausgeräumt werden.

2) Neuerungen

Jetzt aber zu den Neuerungen von PHP. Da ist einiges dabei:

a) Traits (alternativ: horizontal reuse)

Kurz – was ist ein Trait: Man kann einen Trait als eine Gruppe von Methoden verstehen der zwischen den Klassen weitergereicht werden kann. Dadurch kann man sich einiges an redundanten Code sparen und kommt dem DRY (don’t repeat yourself) ein Stück näher.

Was mit Vererbung ist? Klar kann man auch Vererbung nutzen, aber ein Trait geht etwas weiter: Während eine Vererbung immer zwischen zwei Klassen geschieht die direkt miteinander verbunden sind, so ist der Trait eine lose Methodengruppe die ohne die Beziehung zweier Klassen verwendet werden kann.

Hier ein Beispiel wie ein Trait aufgebaut ist (Quelle: php.net)

< ?php
class Base {
	public function sayHello() {
		echo 'Hallo ';
	}
}

trait SayWorld {
	public function sayHello() {
		parent::sayHello();
		echo 'Welt!';
	}
}

class MyHelloWorld extends Base {
	use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
?>;

Als Ausgabe erhält man am Ende:

Hallo Welt!

b) Array Dereferenzierung

Falls man eine Funktion hat, die einen Array zurückliefert war es früher nur mit einem Umgehungsweg machbar, diesen Array dann weiterverwenden zu können. Das wird nun endlich geändert. Nachfolgend das alte Vorgehen und das neue Verfahren:

Alte Vorgehensweise:

< ?php

function fruit () {
	return array('a' => 'apple', 'b' => 'banana');
}

$fruits = fruit();
echo $fruits['a'];
?>

Neue Vorgehensweise:

< ?php

function fruit () {
	return array('a' => 'apple', 'b' => 'banana');
}

echo fruit()['a']; // apple
?>

Das sieht doch gleich logischer und aufgeräumter aus Smiley

c) Fluent Interfaces

Methodenaufrufe können nun direkt nach dem Constructor durchgeführt werden:

echo (new Fruit())->getName();

d) callable

Ein neuer Typehint “callable” ermöglicht nun die Prüfung ob das Übergebene irgendwie aufgerufen werden kann. Ob ich die Funktion toll finde weiß ich noch nicht, denn eigentlich muss man als Entwickler wissen ob das was man ausführen will, auch irgendwie aufrufbar ist Zwinkerndes Smiley

< ?php
function domywork(callable($ab)) {
	$ab();
}
?>

e) <?= dauerhaft verfügbar

Womit ich nicht sonderlich zufrieden bin, ist dass der Short-Syntax zur Ausgabe einer Variablen nun dauerhaft verfügbar ist:

< ?=$var ?>

Ich mag die lange Variante da lieber:

< ?php echo $var; ?>

Ausserdem verwendet man die Short Variante nur wieder in dem immer noch beliebten HTML Matschcode durch den man sich dann irgendwann wühlen darf. In PHP muss endlich einziehen, dass zwischen HTML und PHP eine Trennung durch ein Templatingsystem ist und nicht immer alles durchgewurgelt wird.

f) und vieles mehr

Es sind noch ein paar weitere Änderungen eingeflossen, die ich hier nur als Liste wiedergebe:

  • Zugriff auf Upload Progress ohne Extension.
  • E_ALL enthält nun E_STRICT
  • Der Standard Charset ist nun UTF-8 kann aber geändert werden
  • Ein kleiner eingebauter Webserver ist enthalten, der zum Testen von Scripten verwendet werden kann.
  • $GLOBALS hat nun eine lazy initialisation, sprich sie wird nur dann aktiviert wenn man sich auch verwendet.
  • Native Binärzahlen (wer die braucht)
  • Variable Methodenaufrufe

3) Fazit

PHP geht stetig, wenn auch langsam voran, die veralteten Sprachkonstrukte anzugleichen und aufzuräumen. Durch die Neuerungen kann man zudem das DRY Konzept einfacher einhalten, wenn man Traits sauber einsetzt.

Durch den Bruch mit alten Versionen werden endlich die veralteten Scripte aufgeräumt oder funktionieren einfach nicht mehr. Somit kommen die buggy Scripte von anno dazumal aus dem Netz, ich befürchte allerdings, dass neue bald nachkommen werden.


Viewing all articles
Browse latest Browse all 33