Что нового в PHP 5.4
-
Wiki: PHP 5.4
- php.net: Возможности в версии PHP 5.4.
<?=
— короткая запись вывода на экран работает всегда
Wiki: https://wiki.php.net/rfc/shortags
Короткая запись о которой идет речь это: <?=
вместо <?php echo
.
Для работы такой короткой записи вывода на экран в версиях ниже 5.4 нужно было, чтобы опция short_open_tag
в php.ini была включена.
Пример длинной и короткой записи:
<a href="#"><?php echo $page ?></a> <a href="#"><?= $page ?></a>
[1,2]
— запись массива, без слова array
wiki: Short syntax for arrays
$a = [ 1, 2, 3, 4 ]; $a = [ 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4 ];
trait Class {}
— примеси (трейты)
Трейт - это аналог класса, который содержит в себе методы. Нужен он для «подмешивания» его в имеющийся класс, чтобы методы трейта стали методами класса в который он добавлен.
Несколько примесей можно задавать через запятую:
trait TR_A { public $var = 'var'; function foo() { return 'foo'; } } trait TR_B { function bar() { return 'bar'; } } class A { use TR_A, TR_B; // подмешиваем function hello() { return 'hello A'; } } $A = new A(); echo $A->foo(); // foo echo $A->bar(); // bar echo $A->hello(); // hello A echo $A->var; // var class B extends A { use TR_A, TR_B; function hello() { return 'hello B'; } } $B = new B(); echo $B->foo(); // foo echo $B->bar(); // bar echo $B->hello(); // hello B
Приоритеты трейтов
При совпадении названий свойств/методов приоритеты расставляются так: текущий класс имеет наивысший приоритет, затем трейт, а затем расширяемый класс. Другими словами: элементы из текущего класса переопределяют элементы в трейте, которые в свою очередь переопределяют унаследованные элементы.
Статический доступ к методу примеси из класса
Когда в класс подмешивается trait, то его методы становятся методами класса, включая статические и статический доступ:
trait A { static function func(){ echo 'A'; } } class B { use A; } B::func(); //> A
Подробнее про трейты читайте в документации
foo()[0]
— быстрое получение элемента массива
Теперь не нужно сохранять массив, который вернула функция/метод в переменную и получать элемент массива из этой переменной. Можно сразу получать элемент из функции/метода:
$foo = func()[0]; $foo = Class::func()[0];
(new Foo)->method()
— доступ к элементу объекта при его создании
$foo = (new Foo)->method(); $foo = (new Foo)->property; $foo = (new Foo)[0]; // было так $obj = new Foo; $foo = $obj->method();
Class::{'foo'}()
— динамичное указание метода
Чтобы вызвать статический метод/свойство класса, не нужно запоминать его в отдельную переменную:
class A { static function foo() { echo "Hello world!"; } } $x = "f"; A::{ $x .'oo' }();
callable
— новый тип для аргументов функции/метода
Авто-проверка передаваемых данных в функции/методы, известная как «контроль типа» (typehint), продолжает развиваться и теперь понимает слово callable
.
Раньше для автоматической проверки типа передаваемого параметра, в аргументах функции/метода можно было указывать только: array
или имя класса
.
Теперь, можно указать еще: callable
— значит, что передаваемый аргумент должен быть вызываемым, т.е. удовлетворяет условию is_callable( $arg, false ).
Пример:
function func( callable $callback ){ return true; } func('trim'); //> true func( function(){} ); //> true $db = new wpdb(); func( array($db, 'query') ); //> true func('my_trim'); //> fatal error: Argument 1 passed to func() must be callable, string given
@
— улучшена производительность
Оператор @
нужен для подавления вывода ошибок любого уровня. Вообще его использовать не рекомендуется, но иногда с ним короче:
if( @ $_GET['foo'] ) echo 'OK'; // или так if( isset($_GET['foo']) && $_GET['foo'] ) echo 'OK'; // раньше так работало быстрее раз в 20, теперь раз в 5
Использовать @
нужно как можно реже и очень осторожно, потому что часто заметки и предупреждения дают понять, что логика кода работает неправильно. Например, у меня бывало что лезу поправить казалось бы безобидный NOTICE, но при анализе выясняется что ошибка появилась из-за неправильной логики кода, которая изменилась в процессе расширения кода...
—