Table of contents

  1. PHP5 (5.3)
    1. Zalety
      1. __autoload
      2. foreach bez kopiowania
      3. __call/__callStatic
      4. Obiekty udające tablice
      5. throw/try/catch
      6. XML: DOM, XSLT
      7. Obiekty przekazywane przez referencję
      8. Wywoływanie metod z każdego wystąpienia obiektu
      9. __construct
      10. E_STRICT
      11. PDO
      12. Reflection
      13. Lambdy (funkcje anonimowe) i domknięcia (ang. closures)

Zalety

__autoload

Nie trzeba w kodzie mieć gąszczu require/include. Wystarczy napisać jedną funkcję __autoload, która zostanie wywołana za każdym razem jak PHP natrafi na niezaładowaną klasę. Żadnego nadmiarowego ładowania.

function __autoload($klasa) {require_once("klasy/$klasa.php");}

Oczywiście trzeba najpierw te klasy mieć :)

foreach bez kopiowania

Można użyć

foreach($tablica as &$element) $element=$foo;

by modyfikować elementy tablicy.

__call/__callStatic

PHP5 pozwala 'złapać' odwołania do nieistniejących pól i metod obiektów. W ten sposób można budować obiekty z „wirtualnymi” metodami, np. uniknąć pisania setek funkcji getCośtam() i setCośtam(). Więcej o setterach/getterach. W wersji 5.3 to samo działa dla wywołań statycznych (Klasa::metoda())

Obiekty udające tablice

Można zaimplementować interfejsy tablic w każdym obiekcie i używać go jak zwykłej PHPowej tablicy. Pozwala to zamienić wywołania w stylu $obiekt->get('cos') na $obiekt['cos'] (także używanie obiektów z foreach()!). Więcej o tablicach z SPL.

throw/try/catch

Obsługa wyjątków to jednak fajna sprawa. Na ogół w PHP programuje się pisząc „na słowo honoru”. Skrypt działa póki działa. Jak nie działa to wszystko się sypie, a w najlepszym przypadku któraś funkcja łaskawie zakończy męki przez die(). Zamiast sprawdzać rezultat każdej funkcji można zrobić siatkę bezpieczeństwa:

try {
wyświetl_newsy();
}
catch($e) {
echo 'Sorry, dziś newsów nie będzie';
}

W ten sposób nawet najbardziej zagnieżdżona obskurna mała funkcyjka może wyrzucić wyjątek i umożliwić ładną obsługę błędu, zamiast zapoczątkowywać lawinę kompromitacji.

XML: DOM, XSLT

PHP5 ma te rzeczy wbudowane i działają znośnie. Jest to sposób tworzenia stron skrajnie różny od echo "<table…" niemniej bardzo ciekawy i potężny.
Poprzednia wersja PHP też mogła korzystać z tych technologii, ale PHP5 ma nowy, znacznie ulepszony interfejs — np. NodeList wykorzystuje wcześniej wspomniany interfejs tablic:

foreach($document->getElementsByTagName('a') as $link) {…}

Obiekty przekazywane przez referencję

Dawniej:

function &foo(&$bar) {$baz = &qux();}

PHP5:

function foo($bar) {$baz = qux();}

O wiele normalniej.

Wywoływanie metod z każdego wystąpienia obiektu

W PHP4 można było tylko wywołać metody zmiennej.

Ciekawe ile wersji trzeba będzie czekać na funkcja()[$x]

$foo->bar();

W PHP5 można:

Singleton::instance()–>bar();

__construct

Konstruktory już nie muszą mieć określonej nazwy, można na ślepo wywołać konstruktor klasy nadrzędnej. Ot, taka mała, przyjemna rzecz.

E_STRICT

Jeszcze wyższy poziom notice, które czepiają się popularnych hacków i naprowadzają na elegantszy design kodu.

PDO

BTW: żeby działał driver MySQL najlepiej skompilować PHP z --with-pdo-mysql

W PHP5 jest w miarę uniwersalny interfejs dostępu do baz danych. Obsługuje prepared statements, dzięki czemu jest ciut szybszy, a przede wszystkim można go używać w sposób całkowicie odporny na ataki SQL injection.

Reflection

Zestaw klas, które potrafią podczas działania programu analizować jego własną strukturę — np. podać, jakie metody ma klasa, jakie parametry przyjmują funkcje, a nawet niektóre komentarze z kodu (tzw. doccoments przy klasach/metodach).
W typowych programach to jest zbędne, ale za to bardzo się przydaje, gdy robi się różne obejścia, kombinacje i sztuczki — np. można zaimplementować swoje własne zdalne wywoływanie procedur (coś jak XML RPC/SOAP), które będzie się orientowało, co funkcje mogą przyjmować, a co nie.

Lambdy (funkcje anonimowe) i domknięcia (ang. closures)

W 5.3 pojawiły się prawdziwe anonimowe funkcje. Wcześniej było tylko create_function(), które jest tandetnym hackiem przypominającym eval().

Nowe rozwiązanie bardziej przypomina „dorosłe” języki programowania:

usort($tablica, function($a,$b) {return $a-$b;});

choć dostęp do zmiennych poza funkcją został udziwaczniony ze względu na inne PHPowe dziwactwa:

$x = 1
$inc = function() use(&$x) {$x++;};
$inc(); // $x==2