Теперь можно предоставить скалярное выражение, которое включает числовые и строковые литералы и (или) константы, когда раньше ожидалось статическое значение, например, в объявлениях констант или значениях аргументов функций по умолчанию.
<?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()."\n";
echo C::SENTENCE;
?>
Результат выполнения приведённого примера:
4 Значение константы THREE — 3
Массив (array) также определяют через ключевое слово
const
:
<?php
const ARR = ['a', 'b'];
echo ARR[0];
?>
Результат выполнения приведённого примера:
a
...
Функции с переменным количеством аргументов
теперь разрешается реализовывать через оператор ...
, вместо того
чтобы полагаться на функцию func_get_args().
<?php
function f($req, $opt = null, ...$params)
{
// Переменная $params — массив, который содержит остальные аргументы
printf(
'$req: %d; $opt: %d; количество параметров: %d' . "\n",
$req,
$opt,
count($params)
);
}
f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>
Результат выполнения приведённого примера:
$req: 1; $opt: 0; количество параметров: 0 $req: 1; $opt: 2; количество параметров: 0 $req: 1; $opt: 2; количество параметров: 1 $req: 1; $opt: 2; количество параметров: 2 $req: 1; $opt: 2; количество параметров: 3
...
Массивы и объекты, которые реализуют
интерфейс Traversable, разрешается распаковывать
в список аргументов при вызове функций и передаче аргументов через оператор ...
.
В других языках, включая Ruby, оператор знают как splat- или spread-оператор.
<?php
function add($a, $b, $c)
{
return $a + $b + $c;
}
$operators = [2, 3];
echo add(1, ...$operators);
?>
Результат выполнения приведённого примера:
6
**
Добавили правоассоциативный оператор **
возведения в степень, и короткий синтаксис **=
присваивания.
<?php
printf("2 ** 3 == %d\n", 2 ** 3);
printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);
$a = 2;
$a **= 3;
printf("a == %d\n", $a);
?>
Результат выполнения приведённого примера:
2 ** 3 == 8 2 ** 3 ** 2 == 512 a == 8
use function
и use const
Оператор
use
расширили, чтобы в дополнение к классам
поддержать импорт функций и констант.
Конструкция use function
импортирует функции,
а конструкция use const
— константы.
<?php
namespace Name\Space {
const FOO = 42;
function f()
{
echo __FUNCTION__."\n";
}
}
namespace {
use const Name\Space\FOO;
use function Name\Space\f;
echo FOO."\n";
f();
}
?>
Результат выполнения приведённого примера:
42 Name\Space\f
Теперь PHP содержит интерактивный отладчик phpdbg, который реализовали как SAPI-модуль. Подробности даёт документация к модулю phpdbg.
Для функций htmlentities(), html_entity_decode() и htmlspecialchars() добавили директиву default_charset, которая устанавливает набор символов по умолчанию. Обратите внимание: при установке параметров кодировки для модулей iconv и mbstring, которые теперь устарели, они будут иметь приоритет над ini-параметром default_charset для функций модулей iconv и mbstring.
Значение по умолчанию для настройки — UTF-8
.
php://input
Поток php://input
теперь разрешается переоткрывать и считывать столько раз, сколько требуется.
Эта работа также значительно сократила объём памяти, который требуется для обработки
данных POST-запросов.
Теперь разрешается загружать файлы размером больше 2 ГБ.
Объекты GMP теперь поддерживают перегрузку операторов и приведение к скалярным типам. Перегрузка операторов делает код с функциями модуля GMP выразительнее:
<?php
$a = gmp_init(42);
$b = gmp_init(17);
if (version_compare(PHP_VERSION, '5.6', '<')) {
echo gmp_intval(gmp_add($a, $b)), PHP_EOL;
echo gmp_intval(gmp_add($a, 17)), PHP_EOL;
echo gmp_intval(gmp_add(42, $b)), PHP_EOL;
} else {
echo $a + $b, PHP_EOL;
echo $a + 17, PHP_EOL;
echo 42 + $b, PHP_EOL;
}
?>
Результат выполнения приведённого примера:
59 59 59
Добавили функцию hash_equals() для сравнения двух строк за постоянное время. Функция снижает риск атаки по времени; например, во время тестирования хеширования паролей функцией crypt(), когда невозможно использовать функции password_hash() и password_verify(), которые не чувствительны к атакам по времени.
<?php
$expected = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$correct = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$incorrect = crypt('1234', '$2a$07$usesomesillystringforsalt$');
var_dump(hash_equals($expected, $correct));
var_dump(hash_equals($expected, $incorrect));
?>
Результат выполнения приведённого примера:
bool(true) bool(false)
__debugInfo()
Добавили магический метод __debugInfo(), который разрешает объектам изменять свойства и значения, которые отображаются при выводе объекта функцией var_dump().
<?php
class C
{
private $prop;
public function __construct($val)
{
$this->prop = $val;
}
public function __debugInfo()
{
return [
'propSquared' => $this->prop ** 2,
];
}
}
var_dump(new C(42));
?>
Результат выполнения приведённого примера:
object(C)#1 (1) { ["propSquared"]=> int(1764) }
Добавили алгоритм хеширования gost-crypto
.
Алгоритм реализует функцию хеширования GOST, с которой работают в таблицах CryptoPro S-box,
которые определяет секция 11.2 стандарта » RFC 4357.
В поддержку протоколов SSL/TLS в PHP 5.6 внесли широкий спектр улучшений. К улучшениям относятся: включение одноранговой проверки по умолчанию, поддержка сопоставления отпечатков сертификатов, снижение защита от атак повторного согласования по протоколу TLS и много новых параметров SSL-контекста, которые помогают точнее контролировать параметры протокола и проверки при работе с зашифрованными потоками.
Подробнее изменения описывает раздел руководства «Изменения OpenSSL в PHP 5.6.x».
Модуль pgsql теперь поддерживает асинхронные
соединения и запросы, чем разрешает неблокирующее взаимодействие с базами данных
PostgreSQL. Асинхронные соединения разрешается устанавливать через константу
PGSQL_CONNECT_ASYNC
, а новые функции
pg_connect_poll(), pg_socket(),
pg_consume_input() и pg_flush() помогают
обрабатывать асинхронные соединения и запросы.