PHP 5.4 w wersji finalnej wydane!

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 i continue nie będą już przyjmować zmiennych, należy w tym celu stosować stałe
  • Konstrukcja <?= jest obecnie dostępna niezależnie od ustawienia short_open_tag w php.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 z php.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.

Dodaj komentarz