Что нового в php 5.4

Категория: / DEV Блог / PHP (LAMP)
PHP 5.4 подвергся значительным изменениям, большинство из которых мы рассмотрим.

Обращение к члену класса при создании объекта

$object = (new SomeWhat(param))->setStyle(20)->setText('Hello')->load();


Сокращенный синтаксис создания массива

$a = [1, 2, 3];
$b = ['key' => 'value', 'key1' => 'value1', 'keyN' => 'valueN'];


Разыменование массива

Теперь возможен такой синтаксис обращения к элементу возвращаемого функцией массива:

function getArray () {
    return array('a' => 'A', 'b' => 'B');
}
 
echo getArray()['a'];


Выведет:

А

Синтаксис Class::{expr}()

Расширена возможность запутать программистов при вызове методов класса/объекта.

class A { function b(){echo"b";} }
 
$b = 'b';
$a = new A();
 
$a->b();
$a->$b();
$a->{'b'}();
 
a::b();
a::$b();
a::{'b'}();


Выведет

bbbbbb

Добавлен callable тип параметров

Это уточнение типа параметра позволяет передавать:
- строку с названием функции
- замыкание (closure)
- массив состоящий из (имя класса|объект, название метода)

function foo(callable $call) {
    $call();
}


Возможность переназначить объект замыкания

class A {
    function __construct($val) {
        $this->val = $val;
    }
    function getClosure() {
        //returns closure bound to this object and scope
        return function() { return $this->val; };
    }
}
 
$ob1 = new A(1);
$ob2 = new A(2);
 
$cl = $ob1->getClosure();
echo $cl(), "\n";
$cl = $cl->bindTo($ob2);
echo $cl(), "\n";


Выведет:
1
2

Вернули $this в замыкания!

Теперь в замыкании доступны все свойства объекта, независимо от их видимости.

class A {
    private $value = 1;
 
    function a($name) {
        return function() use ($name) {
            return $this->$name;
        };
    }
 
    function b() {
        return function($name)  {
            return $this->$name;
        };
    }
}
 
$a = new A();
$ca = $a->a('value');
echo $ca();
$cb = $a->b();
echo $cb('value');


Выведет:

1
1

Трейты

Подробнее о трейтах

Они убили $GLOBALS

Теперь переменная $GLOBALS создается динамически, если зафиксировано обращение к ней.

Оптимизирован оператор тишины @

Нет, правда, он стал работать быстрее!

$x = @file('/etc/passwd');
var_dump($x);


Убрали break/continue $var

Конструкция по прежнему работает, если использовать константу (вместо переменной $var).

Выпилен безопасный режим

Safe mode is gone. Также как и все связанные с ним опции.

Запилили register_globals

PHP расставлся со своей старой дырой в безопасности.
Также как и с register_long_arrays.

Полный список изменений можно найти например, здесь

Тестирование скорости php 5.3 vs 5.4

Результаты теста:

PHP 5.3.8 (cli)
*********
Generation: 0.13311. Memory: 4428104. Peak: 4447472
 
PHP 5.4.3 (cli)
*********
Generation: 0.11254. Memory: 2840984. Peak: 2854704


При практически равной скорости выполнения, php 5.4 затратил вдвое меньше оперативной памяти.
Результат не может не радовать, будем надеяться что цифры не кукурузные и соответствуют действительности.

Для теста использовался следующий код:
Запускался на машине с win7 x64, AMD FX, 8Gb.

$begin = microtime(TRUE);
 
require "./loader.php";
 
core::set_debug(0);
$core = core::get_instance();
 
for ($i=1;$i<1000;$i++) {
        $core->class_register('config');
        if ($i%100==0) echo '*';
}
 
$finish = microtime(TRUE);
$diff = sprintf('%.5f', $finish - $begin);
$peak = memory_get_peak_usage();
$mem = memory_get_usage();
echo "\nGeneration: $diff. Memory: $mem. Peak: $peak";