Что нового в PHP 5.6
-
Wiki: PHP 5.6
-
php.net: Новые возможности PHP 5.6.
- habrahabr.ru: Остальные новинки PHP 5.6 не связанные с синтаксисом.
const PLUS = 1 + 2;
— скалярные выражения в константах/свойствах/аргументах функции
Теперь стало возможным указывать в значения констант примитивные PHP выражения (выражения из скаляров).
Точнее, новинка касается не только констант, а всего где раньше PHP ожидал статическое значение. Теперь вместо статики можно указать выражение из чисел/строк/констант. Если точнее, то PHP выражение можно указывать: в константах/свойствах класса и в значении аргумента функции по умолчанию.
const ONE = 1; const TWO = ONE * 2; class C { const THREE = TWO + 1; const ONE_THIRD = ONE / self::THREE; const SENTENCE = 'Значение THREE равно '. self::THREE; public function f( $a = ONE + self::THREE ){ return $a; } } echo (new C)->f() .' - '. C::SENTENCE; //> 4 - Значение THREE равно 3
const ARR = ['a', 'b'];
— константа может хранить массив
Стало возможным держать в константе массивы:
const ARR = ['a', 'b']; echo ARR[0]; //> a
func( ...$args )
или func( ...[2, 3] )
— запаковка/распаковка параметров функции
Wiki: Argument Unpacking
Оператор ...
еще называют «Splat Оператор», «Scatter operator» или «Spread operator».
Когда мы не знали заранее сколько параметров может получить функция, нам приходилось внутри функции обрабатывать переданные параметры с помощью специальных функций: func_num_args(), func_get_arg(), func_get_args().
Запаковка передаваемых параметров в одну переменную при декларации функции
Теперь они не нужны и мы можем получить все параметры в одной переменной, для этого перед этой переменной нужно указать оператор ...
:
function sum( ...$numbers ){ $plus = 0; foreach( $numbers as $n ){ $plus += $n; } return $plus; } echo sum( 1, 2, 3 ); //> 6
Еще пример:
function func( ...$numbers ){ print_r( $numbers, 1 ); } func( 1, 2, 3 ); /* Получим: Array ( [0] => 1 [1] => 2 [2] => 3 ) */
Распаковка передаваемых параметров при вызове функции
Теперь с помощью splat оператора ...
, можно указать параметры функции сразу из значений массива:
function plus( $a, $b, $c ){ return $a + $b + $c; } $array = [ 2, 3 ]; echo plus( 1, ...$array ); //> 6 // или так echo plus( 1, ...[ 2, 3 ] ); //> 6
Замена функции call_user_func_array()
Теперь call_user_func_array( $callback, $param_arr )
, которая обычно не самая быстрая, можно заменить так:
$params = [ 1, 2, 3 ]; $callback( ...$params );
Распаковка в массив
Ассоциативные массивы распаковывать нельзя.
// $arr1 = [ 'key' => 1 ] вызовет ошибку Fatal error $arr1 = [ 'foo', 100 ]; $arr2 = [ 'val', 200 ]; $arr = [ 1,89, 'str', ...$arr1, 22 ,...$arr2, 456, 52 ]; print_r( $arr ); /* Array ( [0] => 1 [1] => 89 [2] => str [3] => foo [4] => 100 [5] => 22 [6] => val [7] => 200 [8] => 456 [9] => 52 ) */
**
— оператор возведения в степень
До php 5.6, чтобы возвести число в степень нужно было использовать функцию pow(2,2);
, а теперь есть оператор **
:
// пример 1 echo $a = 2 ** 2; //> 4 // пример 2 $a = 2; echo $a **= 2; //> 4 // пример 3 echo $a = 2 ** 3 ** 2; //> 512 = 2^9
use function
и use const
— импорт функций и констант в пространство
Теперь стало возможным при помощью ключевого слова use
подключать функции или константы другого пространства в наше:
namespace our\space { const FOO = 42; function func() { echo __FUNCTION__; } } namespace my\space { use const our\space\FOO; use function our\space\func; echo FOO .' - '. func(); //> 42 - our\space\func }
—