PHP 5.6: что новенького?

Потребовалось много времени, но мы наконец-то получили новую версию PHP. В ней представлены некоторые новые интересные функции и улучшения, в то время как другие функции были удалены или помечены как устаревшие.

Давайте заглянем внутрь и посмотрим на то, что предлагает последняя версия.

Изменения, несовместимые с предыдущими версиями

В этой части я приведу список изменений, несовместимых с прошлыми версиями. Однако стоит отметить, что большая часть кода PHP5 будет работать в версии PHP 5.6 без каких-либо модификаций.

json_decode

Согласно спецификации JSON, json_decode() сразу устранит все не-строчные варианты JSON литералов, такие как true, false и null. Соответственно будет установлен json_last_error().

GMP ресурсы

Если вы не знаете, что такое GNU Multiple Precision (GMP) в PHP, тогда я бы посоветовал, вам познакомится с этой статьей на сайте PHP.net. В версии PHP 5.6 GMP ресурсы являются объектами. Вам не потребуется изменять что-то в уже существующем коде, кроме случая, когда вы явно проверяете ресурс с помощью метода is_resource().

Mcrypt

Все функции библиотеки Mcrypt, которые используют ключи и векторы инициализации (IV) не принимают ключи или IV не корректного размера. К таким функциям относятся mcrypt_encrypt(), mcrypt_decrypt(), mcrypt_cbc(), mcrypt_cfb(), mcrypt_ecb(), mcrypt_generic(), и mcrypt_ofb().

Элементы массива и переопределение

До версии PHP 5.6, когда мы объявляли массив в качестве свойства класса с явными и неявными ключами, значение массива переопределялось по умолчанию, когда явный ключ был такой же, как последовательный неявный ключ:

class helloWorld {
        const ONE = 1;

        public $array = [
            self::ONE => 'Eclipse',
            'Sublime',
            'PHPStorm',
        ];
    }
     $hello = new helloWorld();
     print_r($hello);
     // до версии PHP 5.6
    array('Sublime', 'PHPStorm')
     // версия PHP 5.6
    array('Eclipse', 'Sublime', 'PHPStorm')

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

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

С выходом PHP 5.6 стало возможным создавать скалярное выражение, содержащее как числовые константы, так и строковые литералы. В предыдущих версиях PHP скалярные выражения должны были использоваться как статические значения константного аргумента функции или при объявлении свойства класса:

const ONE = 1;
// Использование скалярного выражения в константе 
const TWO = ONE * 2;
 class helloWorld {
// Использование скалярного выражения в свойстве класса
const THREE = TWO + 1;
// Использование скалярного выражения в методах
public hello f($a = ONE + self::THREE) {
return $a;
    }
}
echo (new helloWorld)->hello()."n";

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

Раньше мы использовали функцию func_get_args(), чтобы получить все аргументы, доступные в вызове функции, но в версии PHP 5.6 это можно легко сделать при помощи оператора «...»:

function myTools($name, ...$tools) {
    echo "Name:". $name.'<br />';
    echo "My Tool Count:". count(tools);
}
 myTools('Avinash', 'Eclipse');
// Вывод:
// Name: Avinash
// My Tool Count: 1
myTools('Avinash', 'Eclipse', 'Sublime');
// Вывод:
// Name: Avinash
// My Tool Count: 2
 myTools('Avinash', 'Eclipse', 'Sublime', 'PHPStorm');
//Вывод:
// Name: Avinash
// My Tool Count: 3

Распаковка аргументов

Мы можем использовать оператор «...» для распаковки любого аргумента, который может быть массивом или множеством обходимых (Traversable) объектов:

function myTools($name, $tool1, $tool2, $tool3) {
        echo "Name:". $name.'<br />';
        echo "Tool1:", $tool1.'<br />';
        echo "Tool2:", $tool2.'<br />';
        echo "Tool3:", $tool3;
    }
    $myTools = ['Eclipse', 'Sublime', 'PHPStorm'];
    myTools('Avinash', ...$myTools);
    // Вывод:
    // Name: Avinash
    // Tool1: Eclipse
    // Tool1: Sublime
    // Tool1: PHPStorm

Сокращенная форма оператора **

Оператор ** был добавлен для операции возведения в степень. Также есть поддержка краткой записи этого оператора:

echo 2 ** 3;
echo "<br/>";
$a=2;
$a **= 3;
echo $a;
 // Вывод:
// 8
// 8

Обратите внимание, что порядок операций сильно зависит от оператора. Давайте рассмотрим следующий пример для более ясного понимания:

echo 2 ** 2 ** 4;

Вы, возможно, ожидаете, что это выражение возвращает 256, как если бы группировка имела вид (2 ** 2) ** 4, но в этом случае это не так. На самом деле, результат будет равен 65 536, так как выполнение происходит справа налево, и выражение может быть представлено как 2 ** (2 ** 4).

phpdbg

В PHP 5.6 был добавлен интерактивный отладчик, названный phpdbg. Для более подробной информации обратитесь к официальному документу по phpdbg.

Данный phpdbg отладчик разработан в виде SAPI модуля.

__debugInfo()

Также в PHP 5.6 был добавлен волшебный метод, позволяющий изменять свойства и значение объекта при выводе объекта с помощью var_dump():

class demoDebugInfo() {
    private $val;

    public function __construct($val) {
        $this->val = $val;
    }

    public function __debuginfo() {
        return [
            'iamchanged' => $this->val + 3;
        ];
    }
}
$debugInfo = new demoDebugInfo(50);
// Мы получим измененный массив, возвращаемый волшебным методом __debuginfo.
var_dump($debugInfo);<b>
</b>

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

Набор символов для функций htmlentities(), html_entity_decode() и htmlspecialchars() можно задать с помощью метода default_charset().

Загрузка файлов большого размера

Существует возможность загрузки файлов размером более 2 ГБ.

Поток php://input может быть использован повторно

Поток php://input можно использовать столько раз, сколько вам нужно для чтения данных. Данная функция обеспечивает весомую экономию памяти по сравнению с чтением POST данных.

Операторы use function и use const

Для оператора use было предложено ввести поддержку расширения констант и функций. Это можно сделать при помощи операторов use const и the use function соответственно. Раньше этот оператор ограничивался лишь использованием классов.

Устаревшие функции

Вызов функции из несовместимого контекста

Если вы попытаетесь получить доступ к нестатическому методу статически, или к статическому через контекст объекта, немедленно будет сгенерирована ошибка E_DEPRECATED:

class helloWorld() {
    public static hiWorld () {
    }
}
 $hello = new helloWorld();
 $hello->hiWorld();
 //До версии PHP 5.6
E_STRICT error
// Начиная с версии PHP 5.6
E_DEPRECATED error<b>
</b>

$HTTP_RAW_POST_DATA

Переменная $HTTP_RAW_POST_DATA теперь устарела. Вместо этого нужно использовать php://input.

Настройки кодирования

С введением конфигурации default_charset() соответствующая опция считается устаревшей для iconv и mbstring.

Список измененных функций

Список всех измененных функций PHP 5.6 можно найти в последнем руководстве PHP.

Список новых функций

Список всех новых функций PHP 5.6 можно найти вот в этом разделе руководства по PHP.

Заключение

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

Не забывайте оставлять ваши комментарии и задавать вопросы, если они у вас есть.