Das Groß der Änderungen kam traditionsgemäß mit der ersten alpha-Version, aber trotzdem lohnt sich der Blick auf die alpha3, denn mit ihr kommen 2 “ganz nette” und eine interessante Syntaxerweiterungen (“Syntactic Sugar”) dazu. Aber fangen wir mit dem langweiligen Teil an: Diesmal fiel der “Removed”-Keule die unleidlichen Funktionalitäten rund um die Magic-Quotes zum Opfer. Die INI-Einstellungen magic_quotes_gpc, magic_quotes_runtime und magic_quotes_sybase entfallen ersatzlos, die Funktionen get_magic_quotes_gpc() und get_magic_quotes_runtime() liefern immer nur noch false und die Funktion set_magic_quotes_runtione() wirft von nun an ein E_CORE_ERROR. Ein hoch auf die Putzfrau.
Statische Methoden sind nun per “Ausdruck” aufrufbar.
MyClass::{$something->doSomething()}();Ich steh dem etwas zwiegespalten gegenüber, denn im Grunde sehe ich keinen Einsatzfall und auf der anderen Seite provoziert es womöglich ziemlich hässliche Konstruktionen.
Es gibt nun “echte” Binärzahlen.
$int = 0b1100101;
Nachdem es die hexadezimale und oktale Notation nun schon seit … immer (?) gibt, find ich es verwunderlich, dass die Binärnotation so lange gebraucht hat.
class MyConstants {
const FLAG1 = 0b001;
const FLAG2 = 0b010;
const FLAG3 = 0b100;
}
$myValue = 3; // = 0b011 = 0x3 = 03
// 0b11 & 0b10 = 0b10 != 0 ~= false
if ($myValue & MyConstants::FLAG2) {
// FLAG2 set
}Nun aber das echte Highlight: Die “Short Array Syntax”. Zugegeben, man spart nicht wirklich viel, aber es steigert meines Erachtens die Lesbarkeit enorm.
$array = [1,2,3]; $array = ['foo' => 123, 'bar' => 987]; $array = ['foo' => 123, 1, 2, 'bar' => 987];
Eigentlich tauscht man nur array(..) gegen [..]. Die Wahl auf [..] fiel vorallem wegen der Anlehnung an JSON und einiger anderer Sprachen, die [..] für Listen verwenden.
Ein Einsatzzweck wäre beispielsweise, um “named parameters” zu simulieren, wobei die neue Syntax die Lesbarkeit bei der Verwendnung verbessert.
$user = new User(['name'=>'Horst','id'=>123]);
Auch statische Arrays werden etwas nachvollziehbarer
foreach ([1,2,4] as $number) { /* do something */ }
if (in_array($value, ['foo','bar']) { /* do something */ }Warum der Array-Initialisator in PHP unbedingt wie ein Funktionsaufruf aussehen musste, bleibt auch diesmal ein Geheimnis der Entwickler
Wenn man nun noch list() austauschen könnte …
Soviel bisher zu PHP5.4. Jetzt sieht es so aus, als wäre es das an “neuen, großen Features” gewesen und mir gehen damit auch direkt die Themen aus. Nun heißt es abwarten, wann die Final kommt und wie lange es diesmal dauern wird, bis sie sich ansatzweise durchsetzen kann. Traits sind ein ziemliches Killer-Feature und ich kann es kaum erwarten sie einzusetzen. Aber zum Beispiel mein Hoster setzt weiterhin (auch nach nun jahrelangem Nachfragen) auf 5.2, weswegen sich bei mir zunehmend die Meinung einstellt, dass Hoster keine Alternative mehr sind, wenn man denn irgendwie voran kommen möchte.
7. August 2011 um 11:10 Uhr
Versteh ich nicht, was Du damit sagen wolltest!?
7. August 2011 um 11:39 Uhr
Vielleicht etwas komisch formuliert :X Gemeint ist, dass
| name()
eigentlich Funktionsaufrufe beschreiben.
| array(1,2,3)
sieht schon aus, wie ein Funktionsaufruf, obwohl array ein Datentyp ist. Man schreibt ja auch nicht
| $a = int(1);
| $s = string(‘foo’);
Vermutlich ist es bloß einfach historisch so gewachsen und dann so gebelieben, ohne dass jemand großartig drüber nach gedacht hat (mich eingeschlossen). Im direkten Vergleich fällt aber schon auf, dass Arrays bei der Initialisierung syntaktisch aus der Reihe fallen.
7. August 2011 um 11:42 Uhr
Es ist doch auch ne Funktion!?
http://www.php.net/manual/en/function.array.php
7. August 2011 um 11:47 Uhr
Nein:
| Note:
|
| array() is a language construct used to represent literal arrays, and
| not a regular function.
(direkt auf der verlinkten Manual-Seite)
und
| $tokens = token_get_all(‘< ?php array(1,2);');
| var_dump(token_name($tokens[1][0]));
| // => string(7) “T_ARRAY”
|
| $tokens = token_get_all(‘< ?php substr(1,2);');
| var_dump(token_name($tokens[1][0]));
| => // string(8) “T_STRING”
und in array() ist ‘=>’ erlaubt, das ist in Funktionsaufrufen auch nicht möglich.
7. August 2011 um 11:58 Uhr
Ja ok, jetzt weiß ich, was Du meinst.
$a = 1; // int
$b = 1.23; //float
$c = “Text”; // String
$d = new Obj; // Object
Damals gab es ja noch kein JSON, mit dem man das so elegant abbilden konnte wie heute. In C ist es ja noch blöder gelöst, weil da gibt es sowas gar nicht – gibt es das heute eigentlich?
7. August 2011 um 21:52 Uhr
Puh, dein Hoster hat nur 5.2? 5.3 ist doch schon seit über 2 Jahren draußen. Ich finde du hast ihm genug Zeit gegeben und solltest dringend wechseln, “zur Not” auf einen VServer, da hast du alles in deiner Hand und kannst Bleeding-Edge-PHP installieren
Dass solche Hoster überhaupt überleben…
8. August 2011 um 14:40 Uhr
Ich schäme mich auch, vorallen weil ich selbst gern immer das “Du solltest mal updaten” propagieren :X Mein Hoster hat mich auch immer wieder beschwichtigt und letztens sogar auf einen “reinen PHP5 Server” verschoben, was aber irgendwie keinen Unterschied macht. Auf der anderen Seite steht: “Never touch a running system” und sich selbst nicht um das System kümmern zu müssen ist bequem
Aber dagegen steht wieder, dass man dort auch CLI-Tools, speziell Extensions etc nutzen kann. Schwierig
Ich verlier trotzdem langsam die Nerven. Denke nicht, dass es dies Leben noch was wird. Dann bleibt nur VServer.