Новые возможности PHP 5.6
У разработчиков ядра PHP были и проблемы, и действительно смешные аргументы по поводу некоторых особенностей языка. Достаточно посмотреть на глупое обсуждение того, почему короткий синтаксис массивов – это плохо. Подобные аргументы, наряду с другими вещами заставляют людей думать, что некоторые разработчики ядра не используют PHP в повседневной жизни, поэтому людей, разрабатывающих PHP, и людей, которые используют PHP часто не считают профессионалами.
Но будущее не настолько мрачно. Оно казалось таковым до выхода PHP 5.4, а с тех пор новые версии PHP выходят все чаще. Когда вышел PHP 5.5, принеся некоторые неожиданно классные возможности, сообщество PHP вздохнуло с облегчением, возродив в себе надежду на более специализированную, структурированную и умную разработку ядра. Так оно будет, или иначе – еще предстоит узнать, но будущее языка уже выглядит многообещающим, стоит только взглянуть на те изменения в PHP 5.6, которые уже были внедрены.
Так как всеобъемлющее описание всех предстоящих возможностей было бы слишком обширным для одной статьи, я бы хотел обратить ваше внимание на те из них, которые лично мне кажутся наиболее важными.
Типы MIME в консольном сервере
Типы MIME в PHP могут быть использованы для вывода контента, отличного от PHP, то есть, отличные от text/html. При запуске скрипта PHP вывод по умолчанию будет text/html, но используя дополнительные заголовки можно указать, к примеру, что будет выводиться PDF-файл, и генерировать PDF файлы в вашем скрипте. Когда сервер понимает различные типы MIME, как это делает большинство серверов, как HHVM, Apache, Nginx, они понимают, как обрабатывать соответствующий файл, судя по его расширению, без необходимости указывать тип файла в скрипте. Консольный сервер из PHP 5.4 поддерживает всего несколько MIME-типов, а в новой версии этот список будет расширен до нескольких десятков. Можно с уверенностью говорить, что все распространенные MIME типы будут покрыты встроенным консольным сервером PHP.
Перегрузка внутренних операторов
Это особенность, которая, скорее всего, будет слабо распространена среди веб-разработчиков, использующих PHP, из-за слова “внутренних”. Внутренние означает “не пользовательские”, где “пользовательские” означает область PHP, которую мы, конечные пользователи, используем. Эта особенность касается только внутренних классов, позволяющая упростить разработку в этой области и сделать код более понятным.
Теперь разрешены загрузки более 2 Гб
До версии 5.6 не поддерживалась загрузка файлов от 2 Гб и более. Теперь с этим гораздо лучше, если верить чейнджлогам, и теперь поддерживается загрузка файлов произвольного размера.
Уменьшен размер используемой памяти для данных POST
Размер памяти, выделяемой под данные POST уменьшен в 2-3 раза. Этого удалось добиться, удалив две вещи: опцию always_populate_raw_post_data из php.ini, и суперглобальную переменную$HTTP_RAW_POST_DATA
. Это означает, что теперь вы не сможете получить доступ к необработанным данным POST этим путем, теперь необходимо использовать подобное решение:
1 |
$postdata = file_get_contents("php://input"); |
Улучшенный синтаксис для функций с переменным числом аргументов
Функции с переменным числом аргументов это такие функции, которые могут принимать различное количество аргументов. При передаче нескольких аргументов в функцию обычно необходимо разделять массив элементов с аргументами функции, полученный через func_get_args
, что непрактично. Вот пример того, как это делалось на PHP 5.5 и более ранних версиях:
1 2 3 4 5 6 7 8 9 10 11 |
class MySQL implements DB { protected $pdo; public function query($query) { $stmt = $this->pdo->prepare($query); $stmt->execute(array_slice(func_get_args(), 1)); return $stmt; } // ... } $userData = $db->query('SELECT * FROM users WHERE id = ?', $userID)->fetch(); |
Теперь это можно переписать следующим образом:
1 2 3 4 5 6 7 8 |
class MySQL implements DB { public function query($query, ...$params) { $stmt = $this->pdo->prepare($query); $stmt->execute($params); return $stmt; } // ... } |
Как видно, синтаксис ...$params
говорит функции, что первый параметр она должна принимать “как есть”, а остальные она должна сложить в массив $params. Это освобождает нас от необходимости удалять переменные, полученные через заданные аргументы функции из массива func_get_args
, улучшает сигнатуру функции, и делает код понятнее и читабельнее.
Новый синтаксис также позволяет передачу дополнительных аргументов по ссылке, путем добавления знака амперсанда перед ...$params
, например &...$params
. Такое не было возможно ранее при использовании func_get_args
.
Распаковка аргументов
Вслед за улучшением поддержки функций с переменным числом аргументов была одобрена и распаковка аргументов.
До настоящего времени единственной возможностью вызвать функцию с передачей переменного числя аргументов был вызов функции через call_user_func_array
, что означает “вызвать пользовательскую функцию, передав ей параметры из массива”. Это неуклюжий и некрасивый способ вызова, он не поддерживается конструкторами, к тому же медленный, и необходимо указывать колбэк в виде строки (имени функции), что в большинстве случаев не поддерживается в IDE.
Распаковка аргументов решает все негативные стороны использования call_user_func_array
, и органично дополняет поддержку переменного числа аргументов в функциях, как показано ниже. Распаковка действует следующим образом:
1 2 |
$args = [1, 3, 5, 7, 9]; MyClass::someMethod(...$args); |
Это то же, что и вызов
1 |
MyClass::someMethod(1, 3, 5, 7, 9); |
Это работает для всех мыслимых сценариев, от конструкторов класса, до множественного вызова.
Скалярные выражения для констант
В версии 5.6 была добавлена возможность использовать результаты вычисления для тех мест, которые сейчас используют только постоянные значения. Это означает, что теперь можно использовать арифметические операции и логические выражения при объявлении констант, для аргументов функций, свойств классов и т.д.
Для примера: предыдущие версии PHP сгенерируют ошибку для следующего кода:
1 2 |
const a = 1; const b = a?2:100; |
Теперь же это прекрасно работает.
Можно, конечно, долго обсуждать – действительно константа является константой, если она зависит от значения другой константы, но такие рассуждения оставим на потом.
PHPDBG встроен по умолчанию
Дебаггер phpdbg теперь встроен по умолчанию в качестве серверного API. Он используется из командной строки, или упрощенного Java UI, позволяющим интерактивно задавать точки остановки, изменять программы во время работы и многое другое. Он также позволяет проверять Opcode, и использовать его в вашем коде.
Улучшена поддержка ZIP
В библиотеку ZIP было добавлено несколько улучшений, особенно в виде новых методов. Один из них, который особенно выделяется - ZipArchive::setPassword($password)
, который позволяет легко создавать ZIP-архивы, защищенные паролем.
Импорт функций из пространства имен
В новой версии будет возможен импорт функций и констант из пространства имен. Сейчас возможно импортировать пространства имен и типы (классы / интерфейсы / трейты) посредством оператора use, например:
1 2 3 4 5 6 7 8 9 10 |
namespace foo\bar { function baz() { return 'foo.bar.baz'; } } namespace { use foo\bar as b; var_dump(b\baz()); } |
Начиная с версии 5.6 можно будет использовать операторы use function и use const для импорта отдельных функций и констант (даже констант классов).
1 2 3 4 5 6 |
namespace { use function foo\bar as foo_bar; use const foo\BAZ as FOO_BAZ; var_dump(foo_bar()); var_dump(FOO_BAZ); } |
Заключение
PHP 5.6, для которого на данный момент не назначена дата релиза, определенно выглядит многообещающе, и я надеюсь, что этот краткий обзор списка изменений помог вам понять насколько важно будет вам обновиться.