Что нового в 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
}—