Новые возможности

Константные выражения

Теперь стало возможно представить скалярное выражение, включающее цифровой и строковые литералы и/или константы, в то время где ранее ожидалось статическое значение, например, в объявлениях констант или значениях агрументов функцуий по-умолчанию.

<?php
const ONE 1;
const 
TWO ONE 2;

class 
{
    const 
THREE TWO 1;
    const 
ONE_THIRD ONE self::THREE;
    const 
SENTENCE 'The value of THREE is '.self::THREE;

    public function 
f($a ONE self::THREE) {
        return 
$a;
    }
}

echo (new 
C)->f()."\n";
echo 
C::SENTENCE;
?>

Результат выполнения данного примера:

4
The value of THREE is 3

Также можно определить массив array с использованием ключевого слова const:

<?php
const ARR = ['a''b'];

echo 
ARR[0];
?>

Результат выполнения данного примера:

a

Функции с переменным количеством аргументов используя синтаксис ...

Функции с переменным количеством аргументов теперь можно реализовывать используя оператор ..., вместо того, чтобы полагаться на func_get_args().

<?php
function f($req$opt null, ...$params) {
    
// $params is an array containing the remaining arguments.
    
printf('$req: %d; $opt: %d; number of params: %d'."\n",
           
$req$optcount($params));
}

f(1);
f(12);
f(123);
f(1234);
f(12345);
?>

Результат выполнения данного примера:

$req: 1; $opt: 0; number of params: 0
$req: 1; $opt: 2; number of params: 0
$req: 1; $opt: 2; number of params: 1
$req: 1; $opt: 2; number of params: 2
$req: 1; $opt: 2; number of params: 3

Развертывание аргументов с помощью ...

Массивы и объекты реализующие интерфейс Traversable могут быть развернуты в список аргументов при передаче в функцию с помощью оператора ....

<?php
function add($a$b$c) {
    return 
$a $b $c;
}

$operators = [23];
echo 
add(1, ...$operators);
?>

Результат выполнения данного примера:

6

Возведение в степень с помощью **

был добавлен право-ассоциативный оператор **, обозначающий возведение в степень. Так же доступен короткий синтаксис **=.

<?php
printf
("2 ** 3 ==      %d\n"** 3);
printf("2 ** 3 ** 2 == %d\n"** ** 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

phpdbg

Теперь PHP содержит интерактивный дебаггер, называющийся "phpdbg" и реализованный как модуль SAPI. Подробности читайте в разделе » Документация по phpdbg.

Кодировка по умолчанию

Добавлен ini-параметр default_charset, в котором можно указать кодировку по умолчанию для использования в функциях htmlentities(), html_entity_decode() и htmlspecialchars(). Обратите внимание, что если (сейчас считается устаревшим) заданы параметры кодировки iconv и mbstring, они будут иметь преимущество пере default_charset для iconv и mbstring.

Значение этой настройки по умолчанию равно UTF-8.

Переиспользование php://input

php://input теперь можно переоткрытьи читать столько раз, сколько нужно. Это также привело к значительному уменьшению объема памяти, необходимой для работы с данными POST.

Загрузка больших файлов

Теперь можно загружать файлы размером более 2ГБ.

GMP поддерживает перезагрузку операторов

Объекты 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($a17)), PHP_EOL;
    echo 
gmp_intval(gmp_add(42$b)), PHP_EOL;
} else {
    echo 
$a $bPHP_EOL;
    echo 
$a 17PHP_EOL;
    echo 
42 $bPHP_EOL;
}
?>

Результат выполнения данного примера:

59
59
59

hash_equals() для предотвращение атак по времени при сравнении строк

Была добавлена функция 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 {
    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-crypto. Он реализует функцию хэширования GOST, используемую в таблицах CryptoPro S-box, определенных в » RFC 4357, секция 11.2.

Улучшение SSL/TLS

Очень многое было сделано для улучшения поддержки SSL/TLS в PHP 5.6. Включая разрешение верификации пиров по умолчанию, поддержка сверки отпечатков сертификатов, снижение воздействия атаки пересоединения TLS и множества новых опций контекста SSL для более гранулированного контроля над протоколом и настройками верификации при использовании зашифрованных потоков.

Более подробно все эти изменения описаны в разделе этого руководства Изменения OpenSSL в PHP 5.6.x

Поддержка асинхронности pgsql

Расширение pgsql теперь поддерживает асинхронные соединения и запросы, тем самым разрешая неблокирующее взаимодействие с базами данных PostgreSQL. Асинхронные соединения могут быть установлены с помощью константы PGSQL_CONNECT_ASYNC, и новые функции pg_connect_poll(), pg_socket(), pg_consume_input() и pg_flush(), могут быть использованы для обработки асинхронных соединений и запросов.