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 обладает солидным списком улучшений и дополнительных функций, а также предоставляет одно из самых простых обновлений для предыдущих версий.
Не забывайте оставлять ваши комментарии и задавать вопросы, если они у вас есть.