Что нового в php 5.4
Категория: / DEV Блог
/ PHP (LAMP)
PHP 5.4 подвергся значительным изменениям, большинство из которых мы рассмотрим.
Обращение к члену класса при создании объекта
Сокращенный синтаксис создания массива
Разыменование массива
Теперь возможен такой синтаксис обращения к элементу возвращаемого функцией массива:
Выведет:
А
Синтаксис Class::{expr}()
Расширена возможность запутать программистов при вызове методов класса/объекта.
Выведет
bbbbbb
Добавлен callable тип параметров
Это уточнение типа параметра позволяет передавать:
- строку с названием функции
- замыкание (closure)
- массив состоящий из (имя класса|объект, название метода)
Возможность переназначить объект замыкания
Выведет:
1
2
Вернули $this в замыкания!
Теперь в замыкании доступны все свойства объекта, независимо от их видимости.
Выведет:
1
1
Трейты
Подробнее о трейтах
Они убили $GLOBALS
Теперь переменная $GLOBALS создается динамически, если зафиксировано обращение к ней.
Оптимизирован оператор тишины @
Нет, правда, он стал работать быстрее!
Убрали break/continue $var
Конструкция по прежнему работает, если использовать константу (вместо переменной $var).
Выпилен безопасный режим
Safe mode is gone. Также как и все связанные с ним опции.
Запилили register_globals
PHP расставлся со своей старой дырой в безопасности.
Также как и с register_long_arrays.
Полный список изменений можно найти например, здесь
Тестирование скорости php 5.3 vs 5.4
Результаты теста:
При практически равной скорости выполнения, php 5.4 затратил вдвое меньше оперативной памяти.
Результат не может не радовать, будем надеяться что цифры не кукурузные и соответствуют действительности.
Для теста использовался следующий код:
Запускался на машине с win7 x64, AMD FX, 8Gb.
Обращение к члену класса при создании объекта
$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";