Tutorial PHP 5.4 i PHP 6 – Nowości, zmiany i nowe funkcje – cz. 1

Projekt tworzenia PHP 6 został chwilowo spowolniony w skutek braku porozumienia w niektórych kwestiach autorów języka. Zamiast tego jest rozwijana obecnie wersja PHP 5.4.

Jest ona dostępna pod adresem http://snaps.php.net. Pod tym adresem można różnież znaleźć zrzut trunka SVN, który jest właśnie nieoficjalnym kodem PHP 6.

Kością niezgody z PHP 6 była m.in. obsługa UTF-8 w kodzie. Wbrew pozorom, implementacja tego rozwiązania niesie ze sobą wiele trudności i kwestii spornych, dla przykładu sortowanie lub rozmiar w pamięci. A o co chodzi w ogól z tym Unicode (UTF-8)?

public $wartość_średnia = 1.07;
//zamiast:
public $wartosc_srednia = 0.07;

Problemy z PHP 6 nie zmieniają kwestii, że w PHP 5.4 pojawia się wiele nowości. W niniejszej pierwszej części tutoriala, postaram się przedstawić najważniejsze zmiany.

  • Usunięcie dyrektywy register globals

Usunięta zostaje potencjalnie bardzo niebezpieczna dyrektywa register_globals. Sprawia ona, że zmienne dostępne standardowo poprzez $_REQUEST, czyli pochodzące z $_POST, $_GET lub $_COOKIE, stają się dostępne wprost przez swoją nazwę, czyli np. $username.

  • Usunięcie dyrektyw magic_quotes_gpc i magic_quotes_runtime

Usunięte zostają dyrektywy powodujące automatyczne dodawanie do stringów pochodzących z $_REQUEST ($_POST, $_GET oraz $_COOKIE), a także pochodzących z baz danych (SQL) i plików tekstowych, znaków ucieczki. Innymi słowy, wyłączone zostaje automatyczne stosowanie funkcji addslashes dla nich. Zastosowanie tej funkcji powoduje następujące podstawienia:

‘ –> \’
” –> \”
\ –> \\
NUL –> \NUL (NUL to char o wartości 00h)

  • Wywołania metod poprzez wskaźnik

Poczynając od PHP 5.4 można stosować zapis:

$myobject = new myclass();
$callback = array($myobject, 'methodName');
$callback();

zamiast :

$myobject = new myclass();
call_user_func( array( $myobject, 'say_hello' ));

  • Closures (funkcje anonimowe) z automatycznym kontekstem

W PHP 5.3 pozniższy kod kończył się błędem o treści „Using $this when not in object context„.

class A {
    $word = 'hello';
 
    public function getClosure() {
        return function() { echo $this->word; };
}}
 
$a = new A();
$foo = $a->getClosure();
$foo();

Od PHP 5.4 Closures są automatycznie bindowane z kontekstem, z którego pochodzą. Powyższy kod więc zadziałą wyświetlając tekst: ‘hello‘.

  • Metody bind oraz bindTo klasy Closure do nadawania kontekstu funkcjom anonimowym

Znana już dawno z JavaScriptu technika nadawania kontekstu anonimowym funkcjom. Pokazuje to poniższy przykład.

class A {
    function __construct($val) {
        $this->val = $val;
    }
    function getClosure() {
        return function() { return $this->val; };
    }
}
 
$ob1 = new A(1);
$ob2 = new A(2);
 
$cl = $ob1->getClosure();
echo $cl(); //wyświetla: 1
$cl = $cl->bindTo($ob2);
echo $cl(); //wyświetla: 2