Что нового в php 7

Что нового в PHP 7.4?

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

Предварительная загрузка

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

Управление предзагрузкой выполняется с помощью внесение в php.ini директивы opcache.preload, указывающей на файл, который будет скомпилирован и исполнен при включении сервера.

Стоит учитывать важный момент! Для повышения производительности сервер перезапускают, если источник preload файлов меняется.

Типизированные свойства в PHP 7.4

Значительные изменения произошли в PHP 7.4 в сторону более строгой типизации этого языка. Теперь для типизации доступно большинство функций, кроме void и callable.

Пример подсказки типом в переменных класса:

<?php
class A
public string $name;
public Foo $foo;
>

Стрелочные функции (короткие замыкания) в PHP 7.4

В версии PHP 7.4 добавлен синтаксис коротких замыканий, который способен значительно очистить PHP-код и сделать его более лаконичным.

Пример стрелочных функций, захватывающих переменные по значению автоматически:

$fn1 = fn($x) => $x + $y;
// эквивалентно использованию $y по значению:
$fn2 = function ($x) use ($y) return $x + $y;
>;

Примечания

Короткие замыкания могут получить доступ к родительской области, при этом ключевое слово use — не нужно. $this доступен так же, как и у обычных замыканий. Такие замыкания могут содержать в теле только одну строку, которая также является оператором возврата.

Слабые ссылки в PHP 7.4

В PHP 7.4 добавлена прямая поддержка слабых ссылок с помощью класса WeakReference. Он дает возможность разработчикам сохранить ссылку на объект, которая не будет преградой для уничтожения этого объекта. Ранее поддержка Weak References осуществлялась с помощью расширения pecl-weakref.

Оператор присваивания нулевого слияния (NULL) в PHP 7.4

Оператор присваивания значения NULL сокращает количество операций по объединению нулевых значений и уменьшает размер кода некоторых операторов.

Простыми словами «если левый параметр не существует или равен null, то присвоить ему значение равное правому параметру».

$cart[‘id’] = $cart[‘id’] ?? 0;

Ковариантные возвраты и контравариантные параметры

За редким исключением, ранее в PHP использовали только инвариантные параметры и возвращаемые типы. В последней версии PHP 7.4 допускают ковариацию возвратов и контравариантность для параметров.

Существующие типы параметров

  • Инвариант: если тип супертипа ограничивает тип подтипа;
  • Ковариант: если порядок типов сохраняется (типы упорядочены от более специфических к более общим);
  • Контравариант: если он меняет порядок (типы упорядочены от более общих к более конкретным).

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

Ковариантный тип возврата

function make(): object;

class UserFactory implements Factory

function make(): User;

Контравариантный параметр

function concat(Iterator $input);

class Collection implements Concatable

// accepts all iterables, not just Iterator

function concat(iterable $input)* . . . */>

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

В PHP 7.4 ряд функций уходит в прошлое, что оказывает существенное влияние на ранее написанный код. Поэтому перед переходом на php 7.4 рекомендуем вам внимательно изучить документацию обновленной версии и не игнорировать предупреждения об устаревших (deprecated) функциях. Таким образом вам будет легче мигрировать на новые версии PHP в будущем.

Некоторые из устаревших вещей

Два новых метода сериализации объектов

Для сериализации объектов ранее использовали лишь 2 механизма: методы __sleep()/__wakeup() и интерфейс Serializable. Некоторые разработчики полагают, что это приводит нагруженному и уязвимому коду. Чтобы избежать подобных проблем были добавлены 2 новых метода __serialize и __unserialize.

WordPress на PHP 7.4

По состоянию на 28 мая 2019 года более 66% сайтов на WordPress используют версию PHP 5.x. в то время как WordPress рекомендует пользователям использовать последнюю версию PHP. Также большинство популярных плагинов, которые владельцы сайтов ставят на свои сайты, имеют свойство обновляться и работать только на последних версиях PHP.

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

Некоторые популярные PHP-разработчики делятся своими исследованиями производительности в зависимости от версии PHP и большинство сходится во мнении, что PHP 7.4 способно обрабатывать до 3 раз больше запросов в секунду в сравнении с предыдущими версиями PHP.

Тесты WordPress 5.0 PHP

  • WordPress 5.0 PHP 5.6: 91,64 запросов / сек;
  • WordPress 5.0 PHP 7.0: 206,71 запросов / сек;
  • WordPress 5.0 PHP 7.1: 210,98 запросов / сек;
  • WordPress 5.0 PHP 7.2: 229,18 запросов / сек;
  • WordPress 5.0 PHP 7.3: 253,20 запросов / сек;
  • WordPress 5.0 PHP 7.4: 271,20 запросов / сек.

PHP 7.4 для клиентов хостинга SpaceWeb

Вы можете выбрать нужную версию PHP в разделе «Сайты» — «Настройки конфигурации».
Обратите внимание, что PHP 7.4 доступен в связке с Apache 2.4, в котором отличается синтаксис некоторых директив .htaccess. Подробнее в разделе «Помощь»
Перед сменой настоятельно рекомендуем удостовериться в совместимости вашего сайта с выбираемой версией.

PHP 7.4 для новых клиентов

Хотите протестировать работу своего сайта на PHP 7.4 одним из первых? Заказывайте виртуальный хостинг в SpaceWeb — у нас PHP 7.4 уже доступен на любом тарифе! При необходимости мы можем бесплатно перенести ваш сайт к нам на хостинг. А бесплатный тестовый период в 14 дней позволит вам не спеша провести тестирование сайта на самом современном оборудовании и программном обеспечении.

Топ-6 сервисов для проверки кроссбраузерности сайта

NVMe SSD диски — обзор технологии

10 инструментов сжатия изображений

Надежный хостинг для сайта с бесплатным доменом и SSL за 159 ₽

Надежный хостинг для сайта с бесплатным доменом и SSL за 159 ₽

Еще на эту тему:

Стань партнером

Выгодное предложение SpaceWeb:

  • до 30% вознаграждение ежемесячно,
  • быстрая оплата на карту,
  • работа по договору
  • О компании
  • Контакты
  • Новости компании
  • Важное
  • Скачать приложение

© 2001-2022 ООО «СпейсВэб» Все права защищены.
Лицензия на предоставление телематических услуг связи № 163230.

Стань партнером

Выгодное предложение SpaceWeb:

  • до 30% вознаграждение ежемесячно,
  • быстрая оплата на карту,
  • работа по договору
    О компании
  • Скачать приложение

© 2001-2022 ООО «СпейсВэб» Все права защищены. Лицензия на предоставление телематических услуг связи № 163230.

Общество с ограниченной ответственностью «СпейсВэб». Генеральный директор: Шпагин А.Ю. Юридический адрес: 198095, город Санкт-Петербург, улица Маршала Говорова, дом 35, корпус 5, литер Ж, этаж 4, офис 371. Адрес офиса: 198095, Санкт-Петербург, ул. Маршала Говорова, д. 35, корп. 5, лит. Ж, бизнес-центр «Терминал», офис 401.

PHP 7: что нового и когда выйдет?

Веб-разработка – это одно из самых главных направлений в программировании. И каждый разработчик, который работает в этой сфере и считает себя настоящим программистом, знаком с таким языком, как PHP. Данный язык программирования уже очень давно и успешно применяется во всем мире для разработки сайтов и веб-приложений. И если раньше разработка велась на пятой версии языка, то теперь все переходят на PHP 7. Дата выхода новой версии – 11 июня 2015 года. Стоит отметить, что это только альфа-версия. Финальная запланирована на конец 2015 года.

Нововведения

php 7

Итак, что же нового появится в свежей версии языка? Разработчики внесли следующие изменения и добавления:

  • Производительность PHP 7 увеличена в два раза в сравнении с прошлыми версиями.
  • Будет поддерживаться 64-битная архитектура.
  • Большое число фатальных ошибок превратились в исключения.
  • Появился комбинированные оператор для сравнения значений.
  • Поддерживается сокращенная конструкция use.
  • Добавлен оператор, который проверяет переменную на ее существование и возвращает значение.
  • Стало возможным указывать массивы в качестве значений констант, которые объявляется при помощи define.
  • Синтаксис конструкторов из четвертой версии теперь является устаревшим.
  • В PHP 7 добавлены анонимные классы.

Это краткий список изменений. Далее будут подробно рассмотрены улучшения и нововведения языка. Удивительно, что с выхода пятой версии до выхода седьмой прошло 10 лет.

Почему после PHP 5 не было PHP 6?

php 7 что нового

Для многих это загадка. На самом деле все просто. Выпуск «шестерки» попросту не состоялся. Главной ее особенностью была поддержка символов «Юникод», так как в веб-разработке без этого никуда.

Идея заключалась в реализации этой поддержки в самом ядре PHP 7. Что нового бы это дало? Расширение возможностей языка, конечно. Стало бы возможным использование смайлов в качестве идентификаторов, а также расширилась бы функциональность строк на различных языках.

Эти планы были амбициозными, но имелось большое число проблем. Было очень непросто и утомительно портировать огромную часть кода для того, чтобы поддерживать «Юникод». Это повлияло на разработку других возможностей и расстроило веб-разработчиков. Так, со временем интерес к поддержке «Юникода» начал падать, а шестая версия перестала разрабатываться.

Но все это уже стало историей, так как вышла версия PHP 7. Что нового в ней?

Улучшение производительности

php 7 скриптовый язык общего назначения

Раньше все обновления улучшали производительность незначительно, и для разработчиков главной целью был значительный ее сдвиг в PHP 7 в лучшую сторону. Они смогли с этим справиться. Теперь интерес программистов к движку Zend, на котором основан язык PHP, возрос в несколько раз. Многие специалисты отметили, что новая версия значительно эволюционировала и стала конкурентоспособной. Ведь лидерство стали завоевывать другие скриптовые языки программирования.

Движок Just In Time

php 7 дата выхода

Разработка PHP 7 началась с исследования, позволяющего узнать больше о внедрении данного движка, который способен компилировать код в машинный динамически. Ведь это позволяет в несколько раз увеличить быстродействие кода во время его исполнения. Хотя полностью внедрение еще не произошло, но создатели активно экспериментируют с этим. Если у них получится внедрить в язык JIT-движок, то это позволит поднять предельный уровень производительности еще выше.

Дерево абстрактного синтаксиса

установка php 7 в linux

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

Асинхронное программирование

как установить php 7

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

Если говорить проще, это даст возможность добавить поддержку выполнения таких задач внутри единственного запроса. Асинхронное программирование также позволит в несколько раз увеличить производительность.

Улучшенный синтаксис

PHP 7 – скриптовый язык общего назначения. И для написания этих скриптов был улучшен синтаксис. Теперь код стало легче писать, он выглядит более приятно для разработчиков. Что было изменено?

  • Появилась возможность группировать объявления импорта тех классов, которые находятся в одной строке и в едином пространстве имен. Это помогает сэкономить несколько байт в коде.
  • Добавление Null-коалесцентного оператора решает проблему, возникающую тогда, когда программист хочет присвоить переменной значение, уже присвоенное другой переменной.
  • Комбинированный оператор сравнения, который называют «космическим кораблем», помогает производить трехуровневое сравнение пары значений. Он позволяет понять не только равенство этих значений или их неравенство, но также то, какое из значений больше, если они не равны.

Исключения

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

Как установить PHP 7

1. Необходимо загрузить последнюю версию с официального сайта.

2. Из архива извлекается содержимое в папку php. Никакой инсталляции не требуется.

3. Изменяется конфигурационный файл сервера (имеется в виду Apache).

4. Параметр DirectoryIndex должен быть изменен на index.html.

5. Сервер перезагружается, а затем нужно через браузер зайти на страницу index.php и убедиться, что все работает так, как нужно.

В принципе, процесс не слишком изменился в сравнении с прошлой версией. Установка PHP 7 в Linux несколько отличается, так как нужно загружать из репозиториев пакеты, а затем при помощи специальных команд производить инсталляцию.

Заключение

Конечно, все последние изменения в языке программирования PHP стали существенными. Большинство из них были сделаны из-за конкуренции с Facebook и ее языком программирования Hack, который начал перехватывать лидерство. Именно это дало толчок к развитию. За это можно поблагодарить Марка Цукерберга и его компанию. Ведь это принесло большую пользу сообществу PHP-разработчиков. Теперь веб-разработка вышла на качественно новый уровень. Производительность была увеличена и еще будет расти, а следовательно, конкуренция с другими скриптовыми языками программирования пока будет выдержана. Ведь им еще предстоит длинный путь, чтобы сдвинуть со своего места гиганта PHP.

Что нового в PHP 7.4

PHP 7.4 — последняя версия перед PHP 8, содержит множество дополнений и исправлений синтаксиса, будет выпущен 28 ноября 2019 года. Пост создан для помощи в подготовки к предстоящим изменениям.

PHP 7.4 будет содержать немало новых возможностей, начнем с новых функций, а затем рассмотрим изменения и устаревание функционала.

Короткие замыкания RFC

Короткие замыкания допускают менее подробный синтаксис анонимной функции. Вместо многословного:

можно использовать более лаконичное выражение:

Согласитесь, выглядит здорово?!

  • Короткие замыкания могут получить доступ к родительской области, ключевое слово use — не нужно.
  • $this доступен так же, как и у обычных замыканий.
  • Такие замыкания могут содержать в теле только одну строку, которая также является оператором возврата.

Предварительная загрузка (Preloading) RFC

Предварительная загрузка — удивительное дополнение к ядру PHP, которое может привести к значительному улучшению производительности.

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

Предварительная загрузка управляется директивой opcache.preload в файле php.ini . Эта директива указывает PHP-скрипт, который будет скомпилирован и выполнен при запуске сервера. Данный файл может использоваться для предварительной загрузки дополнительных файлов или через функцию opcache_compile_file() (подробнее см. Документацию PHP).

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

Типизированные свойства RFC

Переменные класса могут быть подсказаны типом:

Это очень долгожданное со времён PHP 7 изменение в направлении более строгой типизации языка. Теперь у нас есть все основные возможности для строгой типизации.Для типизации доступны все типы, за исключением void и callable.

Улучшена разница типов RFC

Разница типов — это тема, достойная отдельного сообщения в блоге ; короче говоря: вы сможете использовать противоречивые типы возврата

. и противоречивые аргументы.

RFC в настоящее время находится на этапе голосования, но, похоже, пройдет без проблем

Интерфейс внешней функции RFC

Интерфейс внешней функции, FFI, позволяет вызывать код C из пользовательского пространства. Это означает, что расширения PHP могут быть написаны на чистом PHP.

Следует отметить, что это сложная тема. Вам все еще нужны знания C, чтобы правильно использовать эту функцию.

Оператор присваивания значения NULL RFC

Появится возможность использовать синтаксис «если левый параметр не существует или равен null, присвоить ему значение правого параметра».

Т.е. вместо этого:

Вы можете сделать это:

Оператор распаковки (. ) в массивах RFC

Теперь можно использовать оператор распаковки в массивах:

Это работает только с массивами с числовыми ключами, с ассоциативными массивами распаковка работать не будет, ошибка будет выдана при обнаружении строкового ключа. Оператор спреда должен иметь лучшую производительность, чем array_merge. Это объясняется не только тем, что оператор распаковки является языковой структурой, в то время как array_merge является функцией, но и оптимизация времени компиляции может быть выполнена для констант массива. Плюс array_merge поддерживает операции только над массивами, а оператор спреда поддерживает реализацию объектов Traversable.

Пользовательская сериализация объектов RFC

В настоящее время PHP предоставляет два механизма для настраиваемой сериализации объектов: методы __sleep()/__wakeup() и Serializable интерфейс. К сожалению, по словам Никиты, оба подхода имеют проблемы., которые приводят к сложному и ненадежному коду Этот RFC добавляет два новых магических метода: __serialize и __unserialize, которые позволяют избежать этих проблем

Использование очень похоже на Serializable интерфейс. С практической точки зрения главное отличие состоит в том, что вместо вызова serialize() внутри Serializable::serialize() вы напрямую возвращаете данные, которые должны быть сериализованы в виде массива. В следующем примере показано, как __serialize()/__unserialize() используются и как они составляются при наследовании:

Разделитель числовых литералов RFC

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

Рефлексия для ссылок RFC

Такие библиотеки как var dumper Symfony, в значительной степени полагаются на API Рефлексии для надежного вывода переменной. Раньше не было должной поддержки рефлексии для ссылок, в результате чего эти библиотеки полагались на «хаки» для обнаружения ссылок.

PHP 7.4 добавляет класс ReflectionReference, который решает эту проблему.

Обновление 02-14: RFC пройден, и изменения подтверждены для PHP 7.4.

Слабые ссылки

Слабые ссылки — это ссылки на объекты, которые не мешают их уничтожению. PHP 7.4 вводит класс WeakReference , который позволяет программистам сохранять ссылку на объект, который не препятствует уничтожению самого объекта. В настоящее время PHP поддерживает Weak References, используя расширение вроде pecl-weakref . В любом случае, новый API отличается от документированного WeakRefкласса.

Вот пример от автора этого предложения, Никиты Попова:

Сначала var_dump выведет object(stdClass)#1 (0) , а потом выведет NULL , так как указанный объект был уничтожен.

Добавлена функция mb_str_split RFC

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

Реестр хэширования паролей RFC

Внутренние изменения в библиотеке хеширования, чтобы пользователям было проще использовать хэширование. Добавлена новая функция password_algos, которая возвращает список всех зарегистрированных алгоритмов хеширования паролей

Изменения и устаревание

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

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

Если бы вы написали что-то вроде этого:

PHP ранее интерпретировал бы это так:

PHP 8 сделает так, чтобы он интерпретировался так:

В PHP 7.4 при обнаружении выражения без скобок, добавлено предупреждение об устаревании синтаксиса, содержащего «.» перед «+» или «-».

Разрешены исключения в __toString RFC

Ранее исключения не могли быть добавлены в магический метод__toString. Они были запрещены из-за некоторых старых механизмов обработки ошибок, правда Никита Попов отметил, что это «решение» на самом деле не решило проблему, которую он пытался решить.

RFC все еще находится на стадии голосования, но с 32 голосами за и 0 против, можно с уверенностью сказать, что это пройдет.

ext-hash всегда включен RFC

Как видно из заголовка, это расширение теперь постоянно доступно во всех установках PHP.

PEAR по умолчанию больше не включен ВНЕШНЕЕ

Поскольку PEAR больше не поддерживается, основная команда решила удалить установку по умолчанию с PHP 7.4.

Этот формат обмена данными никогда не был стандартизирован, и теперь его расширение устарело.

Короткие теги PHP устарели RFC

Короткий открытый тег <? устарел и будет удален в PHP 8. Короткий echo тег <?= оставлен.

array_merge и array_merge_recursive без аргументов

Поскольку добавлен оператор распаковки (. ), теперь имеет смысл использовать array_merge так:

Теперь array_merge и array_merge_recursive позволяют передавать пустой список параметров. Пустой массив будет возвращен, если не было передано ни одного массива.

strip_tags принимает массивы

Ранее несколько тегов можно было бы удалить только перечислением тегов в строке:

PHP 7.4 позволяет использовать массив:

Лево-ассоциативный тернарный оператор устареет RFC

Тернарный оператор имеет некоторые странные особенности в PHP. Этот RFC добавляет статус деприкейт для вложенных троичных операторов. В PHP 8 это устаревание будет преобразовано в ошибку времени при компиляции.

Устарели фигурные скобки для доступа к массивам и строкам

Раньше можно было получить доступ к массивам и смещениям строк, используя фигурные скобки:

Теперь лучше от этого отказаться.

Улучшение в proc_open улучшения

Были внесены изменения, чтобы proc_open мог выполнять программы, не проходя через shell. Это делается путем передачи массива вместо строки для команды .

Список некоторых устаревших вещей

  • Тип real
  • Magic quotes legacy
  • array_key_exists() с объектами
  • FILTER_SANITIZE_MAGIC_QUOTES фильтр
  • Метод Reflection export()
  • mb_strrpos() с указанием кодировки 3 аргументом
  • implode() параметр порядка смешивания
  • Открепление $this от нестатических замыканий ($closure->bindTo(null))
  • функция hebrevc()
  • функция convert_cyr_string()
  • функция money_format()
  • функция ezmlm_hash()
  • функция restore_include_path()
  • директива ini allow_url_include

Обратно несовместимые изменения

Так же не забываем смотреть на полный документ обновлений версий PHP.

Можно выделить следующие несовместимых назад изменений:

  • Вызов parent:: в классе без родителя вызовет ошибку.
  • Использование var_dump для DateTime или DateTimeImmutable больше не будет выводить доступные свойства объекта.
  • openssl_random_pseudo_bytes сгенерирует исключение в случае ошибки. Раньше она возвращала false, что могло привести к генерации пустой строки.
  • Попытка сериализации экземпляров PDO или PDOStatement сгенерирует Exception вместо PDOException.
  • Вызов get_object_vars() для ArrayObject экземпляре будет возвращать свойства самого ArrayObject, а не значения обернутого массива или объекта. Чтобы как раньше получить значения обернутого массива — приведите ArrayObject к типу array

Изменились правила голосования RFC RFC

Технически это не обновление, связанное с PHP 7.4, хотя это, безусловно, стоит упомянуть. Правила голосования для RFC были изменены: для принятия RFC требуется 2/3 голосов, все RFC должны быть открыты не менее 2 недель, чтобы пройти одобрение.

  • Поделиться

Веб-разработчик со стажем программирования более 10 лет, всегда в процессе учебы и созидания.

Что нового в PHP 7

3 декабря 2015 года было объявлено о выходе PHP 7. Новая версия основывается на экспериментальной ветке PHP, которая изначально называлась phpng (PHPNextGeneration — следующее поколение), и разрабатывалась с упором на увеличение производительности и уменьшение потребления памяти.

Самой важной новинкой стало изменение ядра интерпретатора: теперь он называется PHPNG (Next Generation). Благодаря PHPNG удалось увеличить скорость обработки скриптов почти в двое по сравнению с PHP 5.x. Так же появился более эффективный менеджер памяти.

Прирост в скорости на практике хорошо виден на этой картинке. А для WordPress прирост в скорости выглядит так:

php7-benchmark

Синтаксические новинки PHP 7:

$a ?? » — isset и получение значения

Новый оператор слияния с NULL (NULL coalescing operator) ?? — это сокращение проверки isset и получения значения, если проверка пройдена.

Такая проверка часто была нужна в тернарном операторе ?: :

Так же, проверять можно по цепочке:

$a <=> $b — три сравнения сразу: больше, равно, меньше

Новый оператор сравнения <=> — «spaceship operator» (космический корабль). Сравнивает 2 переменные и возвращает результат сравнения в виде числа:

  • -1 — если в сравнении подходит первый символ оператора <
  • 0 — подходит второй символ =
  • 1 — подходит третий символ >

Удобен для использования в usort() :

Можно использовать такой хак, чтобы не писать вложенных тернарных операторов:

define( ‘FOO’, [1,2] ); — массив в define константе

Константы могут содержать массивы еще с PHP 5.6. Но тогда их можно было передавать только через ключевое слово const. Теперь их можно указывать еще и через define() .

use name\space\; — группировка импорта

Теперь для краткой записи, импорт данных в наше пространство можно группировать:

int, float, bool — новые типы параметров функции/метода

Авто-проверка типа передаваемых данных в функции/методы, известная как «контроль типа» (typehint), продолжает развиваться и теперь понимает скаляры: int , float , bool , string . Раньше понимались только типы: array , имя класса или callable (с версии 5.4).

Режим строгой типизации

Если указан тип int и передать строку ‘123’ то проверка все равно будет пройдена, и php превратить строку в число.

Но что, если нужно получать именно число 123? Для этого можно включить режим строгой типизации, поместив в самое начало файла такую строку:

Это объявление должно быть первой строкой в файле, до выполнения какого-либо кода. Оно затрагивает только код файла и только вызовы и возвращаемые значения в этом файле.

Заметка: если строгая типизация указана в файле X, но не указана в файле Y и в файле Y вызывается функция из файла X. То вызов такой функции не будет подвержен строгой типизации!

int, float, bool, array — типы возврата функции/метода

Указывать принимаемый тип, можно еще с версии PHP 5.3. А вот указать какой тип функция/метод должна вернуть доступно только с версии PHP 7. Тут понимаются все типы: string , int , float , bool , array , callable , self (в методах), parent (в методах) , Closure , имя класса , имя интерфейса .

Возвращаемые типы при наследовании методов класса

При наследовании в классах, дочерние методы должны иметь такие же возвращаемые типы как и в родительском классе/интерфейсе:

Навороченный пример того, как можно писать в PHP 7

Тут сразу несколько новинок:

  1. принимаемый и возвращаемый тип;
  2. объединение и распаковка параметров с помощью . ;
  3. пример создания анонимной функции с указанием возвращаемого типа данных.

foo()(), $a::$b::$c, $$foo->bar — единый синтаксис: СЛЕВА НАПРАВО

Важная новинка! Теперь обращения к сложносочиненным переменным разбираются последовательно СЛЕВА НАПРАВО.

Примеры новых возможностей:

Примеры разницы старого и нового распознавания:

Старый код написанный с использованием для обработки переменных возможно не будет работать в новой версии PHP 7.

foreach — изменена логика работы

Теперь foreach не переключает автоматически внутренний указатель перебираемого массива, т.е. next() не работает автоматически.

Так же, если значение массива передается в foreach по ссылке, то он всегда работает с оригиналом массива. Если значение не передается по ссылке, то foreach всегда работает с копией массива и оригинальный массив не затрагивается при изменении его внутри foreach.

Переключение указателей и влияние на работу цикла в PHP 7:

$class = new class — анонимные классы

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

Расширение классов работает как и ожидается:

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

yield . return 99; — возврат выражений в генераторах

Функции-генераторы появились в PHP 5.5. Но там можно было использовать return, только чтобы прервать работу генератора. Теперь return может возвращать выражение (значение/массив/другой генератор), а не только NULL. Но сделать это можно только в конце работы генератора.

Получить возвращенное значение можно методом getReturn() , но только по завершении работы генератора.

Возможность явно вернуть последнее значение упрощает работу с генераторами:
теперь не нужно проверять является ли значение последним, а просто вызываем getReturn() .

yield from gen() — делегирование генераторов

Позволяет разбить сложный генератор на несколько простых.

Для этого используется новый синтаксис: yield from <expr> , где <expr> может быть значением (скаляром), массивом или другим генератором.

<expr> будет работать до тех пор, пока возвращает данные, затем выполнение продолжится в генераторе откуда <expr> был вызван. Смотрите пример:

Пример с массивом:

Пример с return из дочернего генератора:

Остальные новинки PHP 7.0

Синтаксис конструкторов в стиле PHP 4 (имя метода конструктора совпадает с именем класса) теперь считается устаревшим.

Статичные вызовы :: нестатичных методов теперь считаются устаревшими.

list() — изменение поведения. В PHP 5, list() устанавливал значения начиная с правого крайнего значения указанного массива, в PHP 7 параметры устанавливаются начиная с левого крайнего значения массива. Так же в PHP 5 list() умела разбивать строки на символы, в PHP 7 не работает со строками вообще.

Поддержка юникод управляющих (escape-) последовательностей. Т.е. в строках «» и heredoc можно использовать конструкцию \uXXXX для создания юникод символа. Вот так:

Класс IntlChar. Cодержит методы и константы для работы с юникодом.

Функция intdiv() — делит 2 числа и возвращает только целую часть от деления:

session_start() умеет получать параметры (стандартные настройки сессий из php.ini):

Функция preg_replace_callback_array() — альтернатива preg_replace_callback(). Позволяет передать в качестве обратной функции — массив [‘/regex’/ => callback, . ] :

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *