1 marca 2012, po ośmiu kolejnych wydaniach kandydujących i wielu miesiącach pracy, PHP 5.4 zostało wydane w finalnej wersji. Lista dokonanych zmian jest bardzo długa, wprowadzonych zostało sporo nowych elementów, poprawiono wydajność oraz ponad 100 bugów. O większości z tych rzeczy rozpisywano się już nie raz, dlatego postaram się tylko w skrócie podsumować najciekawsze zmiany w PHP 5.4.
Większa wydajność
Według opinii zamieszczonych w sieci, PHP 5.4 jest nawet o połowę szybsze i zużywa o połowę mniej pamięci w stosunku do wersji 5.3.
Wbudowany serwer WWW
Do PHP 5.4 jest dołączany uproszczony web serwer, dostępny z poziomu linii komend. Został stworzony tylko do celów developerskich i nie powinien być wykorzystywany w środowisku produkcyjnym.
Cechy (traits)
Jedna z najbardziej komentowanych nowości w PHP 5.4, wprowadza możliwość dziedziczenia po wielu klasach. Cechy definiowane są analogicznie do normalnych klas, z wykorzystaniem słowa trait
.
Klasy mogą korzystać z wielu cech, które są wymieniane po przecinkach po słowie use
. Same cechy także mogą zawierać inne, tworząc ich zbiory. Aby uniknąć konfliktu nazw, możemy wykorzystać składnię insteadof
, dzięki której okreslimy, która metoda jest ważniejsza. Oprócz tego możemy z wykorzystaniem słowa use
tworzyć dla nich aliasy.
<?php trait A { public function smallTalk() { echo 'a'; } public function bigTalk() { echo 'A'; } } trait B { public function smallTalk() { echo 'b'; } public function bigTalk() { echo 'B'; } } class Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; } } class Aliased_Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; B::bigTalk as talk; } } ?>
Oprócz tego słowo use
może być wykorzystane do zmiany widoczności metody w klasie. Widać to na poniższym przykładzie:
public function sayHello() { echo 'Hello World!'; } } class MyClass1 { use HelloWorld { sayHello as protected; } } class MyClass2 { use HelloWorld { sayHello as private myPrivateHello; } }
W związku z traits, wprowadzono także nową funkcję class_uses()
, która generuje tablicę z cechami, jakich używa dana klasa:
trait foo{} class bar{ use foo; } print_r(class_uses(new bar)); print_r(class_uses('bar'));
Możliwości traits są znacznie bardziej rozbudowane, przedstawiłem tu jedynie podstawowe informacje. Cechy są jedną z nowości, które wzbudzają dużo emocji. Są bardzo oczekiwanym elementem, który może znacznie poprawić możliwości PHP. Jednak z drugiej strony wiele osób przestrzega przed nadużywaniem cech, co może doprowadzić do pogorszenia jakości kodu.
Skrócona składnia definiowania tablic
Dodany został nowy sposób na definiowanie tablic, z zastosowaniem nawiasów kwadratowych:
$array1 = ["foo" => "bar", "bar" => "foo"]; $array2 = [1, 23, 34, "foo"]; $array3 = [1, 2, 3, ["a", "b", "c"], "x" => [7, 8, 9]];
Bezpośredni dostęp do elementu tablicy zwracanej przez funkcję (array dereferencing)
Dotychczas, aby odwołać się do konkretnego elementu tablicy zwracanej przez funkcję, należało najpierw pobrać ją całą do zmiennej, a następnie wybrać ten, który nas interesuje. W PHP 5.4 można to zrobić od razu, wskazując element tablicy bezpośrednio w wywołaniu funkcji:
function myFunction() { return array(1, 2, 3); } echo myFunction()[1];
Wywoływanie metody klasy w zapisie tablicowym (indirect method call)
Istnieje obecnie możliwość wywołania funkcji danej klasy, podając w tablicy nazwę klasy oraz metodę. Obrazuje to poniższy przykład:
class MyClass { public function myFunction($name) { echo "Witaj $name!"; } } $fn = array('MyClass', 'myFunction'); $fn("Marcin");
Podpowiadanie typów dla callbacków (callable typehint)
W przypadku callbacków możemy teraz stosować określenie typu parametru za pomocą słowa callable
. Na poniższym przykładzie pokazano, jak można w ten sposób wymagać określonego parametru przez zdefiniowana funkcję:
function myFunction(callable $callback) { echo "Wywołuję callback: " . $callback(); } myFunction(function() { return 'Witaj!'; });
W przypadku, gdy do funkcji zostanie przekazana zmienna innego typu, otrzymamy odpowiedni błąd:
Catchable fatal error: Argument 1 passed to myFunction() must be callable, integer given, called in …
Możliwość użycia $this
przy funkcjach anonimowych (closures)
W przypadku stosowania closure i obiektów, nie było możliwe normalne korzystanie z konstrukcji $this
(istnieją pewne obejścia tego problemu). Kończyło się to odpowiednim błędem:
Fatal error: Using $this when not in object context in …
Najnowsza wersja PHP rozwiązuje ten problem, wynikiem działania skryptu będzie wyświetlenie zawartości zmiennej $value
.
class MyClass { private $value = „PHP 5.4”; public function myFunction() { return function() { return $this->value; }; } } $a = new MyClass; $fn = $a->myFunction(); echo $fn();
Notacja binarna dla liczb całkowitych
Dotychczas możliwe było definiowanie liczb całkowitych w systemie dziesiętnym, ósemkowym oraz szesnastkowym, stosując odpowiednie przedrostki. PHP 5.4 wprowadza taką możliwość także dla liczb binarnych, z wykorzystaniem 0b
. Poniżej przedstawiono liczbę 28 w różnych notacjach, ostatnia jest możliwa tylko w najnowszej wersji PHP:
$dec = 28; $oct = 034; $hex = 0x1c; $bin = 0b11100;
Śledzenie postępu uploadu
W PHP wbudowano możliwość śledzenia postępu wysyłania danych poprzez formularze. Funkcjonalność jest domyślnie włączona, jej konfiguracja opiera się na grupie zmiennych session.upload_progress.*
w php.ini
. Dzięki niej możemy określić, jaka ilość danych została już wysłana.
Inne nowości
Na zakończenie kilka innych zmian, nie wymagających szczegółowego opisu:
- Instrukcje
break
icontinue
nie będą już przyjmować zmiennych, należy w tym celu stosować stałe - Konstrukcja
<?=
jest obecnie dostępna niezależnie od ustawieniashort_open_tag
wphp.ini
- Usunięcie opcji
register_globals
– definitywny koniec zmiennych globalnych, które zostały domyślnie wyłączone już PHP 4.2 - Usunięcie opcji
register_long_arrays
zphp.ini
– całkowite zrezygnowanie ze starych tablic$HTTP_*_VARS
na rzecz krótkiego zapisu (np.$_GET
zamiast$HTTP_GET_VARS
) - Konwersja tablicy na string powoduje Notice
Podsumowanie
Jak już wcześniej wspomniałem, pełna lista zmian w PHP 5.4 jest niezwykle długa. Wszystkich zainteresowanych odsyłam do dokumentacji. Warto je testować, gdyż wiele z nich może być bardzo pomocna. Oczywiście jak w każdej dziedzinie należy także i tu stosować rozwagę. Pozostaje tylko pytanie, kiedy osoby korzystające z wirtualnych serwerów WWW będą mogly skorzystać z nowych funkcjonalności PHP. Biorąc pod uwagę zwiększenie wydajności nowej wersji (co podoba się hostingodawcom), miejmy nadzieję, że nie będą musiały czekać zbyt długo.