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

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

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

    <?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

### phpdbg

Теперь 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 теперь поддерживают перегрузку операторов и приведение к скалярным типам. Перегрузка операторов делает код с функциями модуля 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() для предотвращения атак по времени

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

### Улучшение в протоколах 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() помогают обрабатывать асинхронные соединения и запросы.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open