Что нового в PHP 5.4
- Wiki: 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, но при анализе выясняется что ошибка появилась из-за неправильной логики кода, которая изменилась в процессе расширения кода...
—