Статьи

Новые функции в PHP 5.6

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

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

Хотя полное объяснение всех предстоящих обновлений было бы слишком обширным, чтобы его можно было бы охватить в одной статье, я хотел бы обратить ваше внимание на некоторые из них, которые я лично считаю наиболее важными.

Типы MIME на веб-сервере CLI

MIME-типы в PHP могут использоваться для вывода содержимого как типа, отличного от PHP, то есть как типа, отличного от text / html. Когда вы запускаете страницу PHP, выводом по умолчанию является text / html, но вы можете использовать заголовки, чтобы установить его, например, как PDF и генерировать файлы PDF. Когда сервер знает о различных типах MIME, как это обычно делают большинство серверов, таких как HHVM, Apache и Nginx, они знают, как обслуживать данный файл по умолчанию, судя по его расширению, без необходимости устанавливать конкретные инструкции в самом PHP. На сервере командной строки из PHP 5.4 было всего несколько типов MIME, и эта версия представит десятки других. Можно с уверенностью сказать, что все распространенные типы MIME теперь будут поддерживаться встроенным PHP-сервером.

Внутренняя перегрузка оператора

Это особенность, которую мы, веб-разработчики, использующие PHP, вероятно, не увидим из-за ключевого слова «internal». Внутренний означает «не пользовательское пространство», где пользовательское пространство — это область разработки PHP, которую мы, конечные пользователи PHP, используем. Он применяется только к внутренним классам, чтобы сделать разработку в этой области более простой и удобной для чтения. Подробное объяснение можно найти здесь .

Загрузка более 2 ГБ теперь принимаются

До версии 5.6 загрузка PHP объемом 2 ГБ и более не поддерживалась. Это больше не так, так как состояние журнала изменений и загрузки произвольного размера теперь поддерживаются.

Использование памяти данных POST уменьшилось

Использование памяти POST-данных сокращалось от 2 до 3 раз, после двух удалений: параметр always_populate_raw_post_data из php.ini и суперглобальная переменная $HTTP_RAW_POST_DATA . Это означает, что вы больше не можете таким образом получать доступ к необработанным данным, но вам нужно полагаться на такое решение, как:

 $postdata =  file_get_contents ( "php://input" ); 

Обратите внимание, что получение POST через ://input недоступно, когда форма состоит из нескольких частей (другими словами, когда форма имеет элемент загрузки файла).

Улучшенный синтаксис для функций с переменными числами

Функции Variadic — это функции, которые могут принимать произвольное количество аргументов. Когда вы предоставили ему несколько аргументов, вам обычно приходилось делать сплайсинг после вызова func_get_args , что было несколько непрактично. Как видно из примера здесь , синтаксис в 5.5 и ранее был:

 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 (); 

теперь синтаксис будет:

 class   MySQL   implements  DB { 
     public   function  query ( $query ,   ... $params )   { $stmt =  $this -> pdo -> prepare ( $query ); $stmt -> execute ( $params ); 
         return  $stmt ; 
     } 
     // ... 
 } 

Как вы можете видеть, синтаксис ...$params сообщает функции принять первый параметр как есть и поместить все остальные в массив $ params. Это избавляет нас от объединения и вызова func_get_params , улучшает сигнатуры функций и делает код более читабельным.

Новый синтаксис также позволяет передавать дополнительные аргументы по ссылке путем добавления префикса ...$params к амперсанду, например: &...$params . Это было невозможно раньше с func_get_args .

Аргумент распаковывается

Примечание: спасибо nikic за указание на эту функцию — она ​​была реализована во время первоначального написания этой статьи

После улучшенной поддержки функций с переменными параметрами распаковка аргументов также была одобрена.

До сих пор единственным способом вызова функции с произвольным числом аргументов, передаваемых в качестве параметров, было использование call_user_func_array что буквально означает «вызов функции пользовательского пространства с массивом параметров». Это было неуклюже и неудобно, не поддерживалось конструкторами, было медленным и требовало обратного вызова в форме строки — имени функции — что означает отсутствие поддержки IDE в большинстве случаев.

Распаковка устранит все недостатки упомянутой функции и естественным образом дополнит вариативную поддержку, показанную выше. Распаковка работает так:

 $args =   [ 1 ,   3 ,   5 ,   7 ,   9 ]; 
 MyClass :: someMethod (... $args ); 

Это то же самое, что звонить

 MyClass :: someMethod ( 1 ,   3 ,   5 ,   7 ,   9 ); 

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

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

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

Например, ранее такой код выдавал ошибку:

 const  a =   1 ; 
 const  b =  a ? 2 : 100 ; 

Теперь это уже не так.

Кто-то может поспорить, является ли константа действительно постоянной, если она зависит от значения другой константы, но такие мета-обсуждения лучше оставить для других времен.

PHPDBG в комплекте по умолчанию

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

Почтовый индекс улучшен

Библиотека Zip получила несколько улучшений, особенно в форме новых методов. Особенно выделяется ZipArchive::setPassword($password) который, наконец, позволяет легко создавать Zip-файлы, защищенные паролем.

Импорт функций пространства имен

Согласно этому RFC , новая версия позволит импортировать функции и константы пространства имен. Прямо сейчас мы можем импортировать пространства имен и типы (классы / интерфейсы / признаки) через оператор использования, например так:

 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 операторы use const для импорта одиночной функции или константы (даже константы класса).

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