php 7 new features
PHP 7 features and improvements
Hurray! PHP 7 is finally out there and to celebrate the release, I created a video that highlights a couple of interesting PHP 7 features.
New PHP 7 features: a quick overview
Have a look at the video, it highlights a couple of PHP 7 features I like. Here’s the list of stuff I cover:
Scalar type hints
Type hints have been available in PHP for while now. Unfortunately they were restricted to classes, arrays and callables.
As of PHP 7, the scalar types (integers, floating point numbers, booleans and strings) can also be used as type hints.
I’m happy with this PHP 7 feature, because it allows developers to ensure a better input consistency of a function/method interface. By default “coercive mode” is enabled. This restricts PHP from throwing a type error when the types don’t exactly match, but when a conversion is still possible.
If you enable “strict mode” (by uncommenting line 6), a type error is thrown when the signatures don’t match.
Return type declarations
Whereas type hints ensure input consistency, return type declarations ensure output consistency.
We use a colon before the opening curly brace of a function to hint the return type.
The same strictness rules apply as with the type hints: if “strict mode” is disabled, return values that can be converted to the preferred type are allowed. If you enable “strict mode” this code will throw a type error.
Anonymous classes
Anonymous classes are useful for simple one-off objects. With anonymous classes you can define a class and instantiate an object inline.
The Closure::call() method
Closures are anonymous functions that are declared inline and assigned to a variable. It can be used as a callback for later execution. In PHP 5 it was already possible to bind an object to the scope of the closure as if it was a method.
The “call” method is one of the PHP 7 features that was introduced to simplify the process.
Generator delegation
Generators are cool, but sometimes hard to explain. Ironically using them is surprisingly simple. It’s all about the “yield” keyword. By using “yield”, a generator is returned with the value that is yielded. A generator implements an iterator which makes it easy to use in while or for loops.
In PHP 7 generator delegation was introduced. This means a generator from another function can be addressed.
Generator return expressions
As mentioned: by using the yield keyword, values can be yielded and iterator over. But return values are ignored by generators.
In PHP 7 the “getReturn” method was added to the Generator class to allow return values in generators.
The null coalesce operator
The null coalesce operator is a shorthand for checking if a value is set and not null within inline comparisons. Instead of doing the same old “isset” check over and over again, just use “??” to return the value if it is set (and not null) or an alternative value instead.
The space ship operator
The so-called “space ship operator” makes it easier to compare values. Instead of returning a typical true/false value, the space ship operator returns one of the follow values based on the result of the evaluation:
Throwables
A big change in PHP 7 is the fact that errors are no longer raised the way they used to be raised. Errors now behave in a similar way as exceptions. They both inherit from the Throwable interface.
This means that errors can now be caught in a try/catch block. You can catch both exceptions and errors as Throwables, but you can also catch errors as Error objects.
There are event different kinds of errors we can catch:
This is also a backwards compatibility break because custom error handlers might not be triggered. If you have a parse error in an eval function, it will throw a ParseError instead of just returning false. Watch out!
Level support for the dirname() function
The dirname function is used more often than you would think. It is the ideal function to refer to directories in a relative way.
But when you want to go a couple of levels up, you end up nesting dirname calls and that will eventually lead to confusion.
As of PHP 7 the dirname function has a second argument that indicates how many levels your going up the directory tree. If you don’t enter a value, 1 is the default.
The Integer division function
Maybe not one the most important PHP 7 features, but still worth mentioning: the intdiv function returns the integer value of a division whereas regular divisions can result in a float being returned.
Uniform variable syntax
In PHP 7 the “uniform variable syntax” was introduced. This standard changes the way indirect access to array keys, properties and methods is evaluated. The PHP 7 interpretation enforces a strict left-to-right evaluation.
This is also considered a backwards compatibility break. It is advised to change your code and use curly braces to enforce the evaluation order if you want your code to work on PHP 7.
Performance
Let’s not forget to mention that the performance of PHP 7 is supposed to be impressive. Some say that it’s twice as fast as PHP 5(.6) others use even more dazzling numbers. I’m confident that it perform great and I’m curious to see the average numbers once people start using it.
Some sources say that it even outperforms HHVM. But don’t forget the phrase lies, damn lies and statistics.
I’m excited, let’s see.
We’re PHP 7 ready
At Combell, the hosting company I work for, we have been testing PHP 7 for a while. We’re a big fan of the PHP 7 features. We already made PHP 7.0.0 RC8 available in our control panel and now we offer PHP 7.0.x on shared hosting.
If you have a Cloud server at Combell and you’re anxious to upgrade to PHP 7, please contact support.
But as mentioned: watch out, there are BC breaks.
Обзор PHP 7
О языке PHP
PHP – это язык программирования, который в основном применяется в веб-разработке, как правило, в части back-end. PHP имеет достаточно длинную историю – его первая версия появилась более 20 лет назад, в 1995 году. За это время было выпущено 7 версий PHP, последняя из которых появилась в декабре 2015 года. О ней и пойдет речь в этой статье.
PHPNG
Релиз PHP 7.0 стал в своем роде прорывом, так как он основывался на phpng – экспериментальном и активно развивающимся проекте PHP, название которого расшифровывается как “PHP Next Generation” – «Следующее поколение PHP». Данную технологию можно было использовать и в предыдущих версиях PHP, однако именно в PHP 7 она была введена как основополагающая. При ее разработке была поставлена цель повысить производительность PHP, но при этом не потерять совместимость.
Zend Engine
PHP 7 основан на третьей версии Zend Engine, в которой был развит проект phpng.
Нововведения
В первую очередь новшества в PHP 7 коснулись самых важных для разработки приложений параметров – это производительность и потребление памяти.
Основное изменение, о котором в первую очередь упоминают в разговоре о PHP 7, это улучшение производительности: показатели PHP 7 приближены к показателям HHVM (разработанной Facebook системы, которая позволяет ускорить преобразование PHP-кода в несколько раз). Не последней причиной этого стало то, что соучредитель Zend Technologies (компании-разработчика ядра PHP) Зеев Сураски рассматривает HHVM как одного из конкурентов Zend. А ведущий разработчик PHP 7 компании Zend Technologies и автор phpng Дмитрий Стогов заверяет, что разница в производительности PHP 5.0 и PHP 7 на синтетическом тесте bench.php составляет 14 раз. На практике большинство пользователей склоняются к мнению, что PHP 7 примерно в два раза быстрее предыдущей версии.
HHVM использует так называемую JIT (Just-In-Time) компиляцию для преобразования кода – несмотря на то, что JIT в 7 версии PHP не появился, PHP 7 поддерживает более хорошую миграцию, которая и позволяет улучшить производительность в разы. Именно новый уровень производительности Дмитрий Стогов выделяет в качестве главной особенности PHP 7.
Улучшение производительности удалось добиться и благодаря тому, что компилятор теперь генерирует более эффектный и короткий байт-код.
В наше время крайне важно думать о пользователях не только стационарных, но и мобильных устройств, поэтому разработчики PHP 7 улучшили исполнения движка и снизили потребление памяти, а также добавили возможность использовать нативное локальное хранилище. К тому же PHP 7 позволяет выполнять асинхронные задачи.
Кстати, при разработке учитывались и популярные тенденции по сокращению потребления ресурсов планеты, поэтому PHP 7 имеет возможность обрабатывать больше трафика, используя все те же ресурсы сервера.
Новые функции
В PHP 7 есть множество новых функций, каждая из которых делает разработку более удобной и простой. Далее вы можете ознакомиться с некоторыми из них.
Анонимные классы могут быть вложенными, но при этом им не будут доступны protected или private-свойства внешнего класса.
Это нововведение направлено на облегчение написания кода и улучшение его читабельности. А вот использование этих значений в качестве имен классов категорически запрещено, т.к. это может привести к критическим ошибкам.
Null coalescing operator – это оператор объединения, который проверяет, существует ли переменная, и возвращает ее значение (либо значение по умолчанию):
Приоритет данной операции равен приоритетам других операций сравнения, при этом его нельзя связать с предыдущим вызовом, т.к. это неассоциативный оператор.
Что касается старых функций, то часть самых невостребованных возможностей была исключена: к примеру, были удалены ASP и script-теги, а также регулярные выражения, совместимые с POSIX, и расширение ext/mysql.
PHP и веб-серверы
PHP широко применяется при написании множества веб-приложений, т.к. этот язык совместим с различными веб-серверами (Apache, Nginx, IIS), базами данных (MySQL, Postgre, MongoDB и т.д.), а также операционными системами.
Поэтому уже традиционно нововведения коснулись не только языка в целом, но и тех его сторон, которые связаны с хостингом.
В первую очередь в PHP 7 было введено Abstract syntax tree (AST) – абстрактное синтаксическое дерево, которое является промежуточным звеном в компиляционном процессе. Именно на этой модели теперь основан синтаксический анализатор. Благодаря этому теперь можно создавать более производительный операционный код.
Еще одним нововведением является Uniform Variable Syntax – универсальный синтаксис для переменных. Это позволяет, с одной стороны, решить часть несоответствий, которые связаны с вычислением значений переменных, но, с другой стороны, создает необходимость переписывать некоторые редко используемые части кода.
Еще раз вернемся к увеличению производительности PHP 7: это благоприятно отразиться на функционале всех хостингов, ведь они смогут увеличить количество своих пользователей без увеличения количества серверов или других улучшений.
Одной из причин повышения производительности является оптимизация структуры внутренних данных, что значительно улучшило процесс работы с памятью.
Нельзя не сказать о некоторых проблемах обратной совместимости, которые могут возникнуть при переходе на PHP 7. Например, теперь нельзя использовать несколько выражений default в switch, т.к. в противном случае вы увидите ошибку. Однако в целом эти проблемы незначительны на фоне тех новых возможностей, которые предлагает PHP 7.
Вывод
Релиз PHP 7 – это не просто выпуск новой версии PHP, но определенная отправная точка для следующих PHP-версий нового поколения. Результатами множества нововведений PHP 7 стал более чистый, удобный и понятный код, значительно увеличенная продуктивность и многое другое, что вы можете самостоятельно оценить, обновив виртуальный сервер до седьмой версии PHP.
PHP 7.3. Что нового
Синтаксис
Устаревшие возможности (deprecated)
Новые возможности
Изменения
Смягчение требований к синтаксису Heredoc и Nowdoc
Heredoc и Nowdoc требовали ставить закрывающий идентификатор первым в новой строке.
RFC для PHP 7.3 предлагает убрать подобные требования для улучшения читабельности кода. Прежде всего чтобы добавить отступы при использовании heredoc/nowdoc идентификаторов.
Полный список изменений в heredoc/nowdoc синтаксисе:
Вот сниппет, который использует новые возможности без нарушения новых правил:
Влияние на обратную совместимость
Пока вы не используете набор идентичных heredox/nowdoc идентификаторам символов в качестве начала строки, вы на коне.
Если у вас имеется heredoc/nowdoc синтаксис подобный вышеописанному, отмечу, что с PHP 7.3, PHP воспримет первый HELLO литерал и выдаст ошибку на следующей строке. В более ранних версиях HELLO WORLD не воспринимался как закрывающий идентификатор для heredoc. Спасибо /u/ImSuperObjective2 с reddit за указание на это
Поддержка конечных запятых в вызовах функций и методов
Это простое изменение, которое разрешает использование конечных запятых в вызовах функций и методах. Это не влияет на декларирование.
Например, следующий синтаксис станет возможным:
Вы не можете использовать более одной запятой в конце или использовать запятые для пропуска аргументов. В основном это изменение для функции с вариативными параметрами. Также с новыми правками синтаксис массива будет выглядеть более последовательным.
Обратите внимание, что Вы не можете использовать эту возможность в объявлениях функций/методов; это неправильно:
Влияние на обратную совместимость
Никакого. Существующий код будет и дальше работать. Если у вас есть вызовы функций принимающие вариативные параметры, добавьте конечные запятые в эти места для удобства. Но использовать их везде — это явно перебор.
Ссылки в list()
Функция list() полезна для быстрого присвоения значений переременным из массива. До версии PHP 7.3 не было возможным указать переменную по ссылке. До PHP 7.3 следующий фрагмент приводил к фатальной ошибке:
Влияние на обратную совместимость
Нет. Вместо того чтобы использовать list() для заполнения нескольких переменных, я бы предложил вам воспользоваться value-объектами, чтобы сделать все проще. Они все равно будут передаваться по ссылке, но сделают ваш код намного чище.
Функция image2wbmp() объявлена устаревшей
Влияние на обратную совместимость
Флаги FILTER_FLAG_SCHEME_REQUIRED и FILTER_FLAG_HOST_REQUIRED при использовании FILTER_VALIDATE_URL объявлены устаревшими
Если ваш код использует эти флаги, просто удалите их и будет хорошо. На данный момент существует более 5000 результатов поиска на github с их использованием.
Влияние на обратную совместимость
Так как оба этих флага объявлены устаревшими, вы увидите уведомление вроде:
Регистро-независимые константы объявлены устаревшими
Кроме того, при попытке получить доступ к константам, которые были объявлены в режиме без учета регистра ( FOO ), вы увидете довольно полезное предупреждение: Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is «Foo»
Влияние на обратную совместимость
Вам придется идти в базовый код, туда где объявляются регистро-независимые константы и последовательно исправлять. Крайне маловероятно, что не будет никаких проблем с этим, потому что отловить все варианты использования довольно трудозатратно, но в результате код станет понятней.
Я не нашел на github примеры подобного использования, но как минимум Drupal и WordPress (два довольно старых и зрелых проекта в PHP) имеют регистро-независимые константы.
Опциональный выброс исключений при ошибках в функциях json_encode и json_decode
Одно из моих любимых. Все эти годы json_encode() и json_decode() молчали об ошибках в PHP-переменных или json-строках, что приводило к забагованному коду. Этот случай даже был в знаменитой критике PHP: Фрактал плохого дизайна.
json_decode возвращает null для невалидного ввода, при том, что null — абсолютно верный объект для декодируемого JSON’а. Эта функция абсолютно ненадёжна, если вы конечно не вызываете json_last_error каждый раз при её использовании.
Потребовалось 6 лет после того поста в блоге и у нас появилась возможность получить ошибку о сбоях работы с json:
Я настоятельно рекомендую вам начать использовать эту функцию. Есть сторонние библиотеки, такие как daverandom/exceptional-json, реализующие аналогичную функциональность для версий PHP 7.2 и ниже. С появлением этой функции в ядре PHP, вы можете удалить этот пакет и тонны некрасивого шаблонного кода с вызовом json_last_error() в каждом месте где вы работаете с json.
Влияние на обратную совместимость
Никакого, если вы не используете собственное исключение и/или константу с такими же именами.
Добавление функции is_countable()
Я написал полифил для is__countable(), если вы хотите начать использовать эту возможность уже сейчас.
Влияние на обратную совместимость
Добавление функций array_key_first() и array_key_last()
В PHP существует 75 различных функций для работы с массивами, но до сих пор не было простого способа получить первый и последний ключи массива без изменения указателя массива или перебора всех ключей (через array_keys() ) и затем получения первого/последнего значения.
Появились две новые функции, array_key_first() и array_key_last() позволяющие это делать.
Влияние на обратную совместимость
Если вы не объявляли свои собственные array_key_first() и array_key_last() функции, то проблем не возникнет.
Миграция с PCRE на PCRE2
PHP использует Perl Compatible Regular Expressions или коротко PCRE в библитеке для работы с регулярными выражениями. С версии PHP 7.2 используется 8.x версия легаси-библиотеки PCRE, а в PHP 7.3 уже будет использоваться PCRE2. Обратите внимание, что PCRE2 считается новой библитекой, хотя в значительной степени совместима с PCRE (8.x).
Новая библитека более агрессивна в валидации паттернов и может привести к ошибкам в существующем коде. Следующий фрагмент будет невалидным с PHP 7.3:
Это довольно незначительное изменение, но есть шанс, что все пойдет не так. Сообщение об ошибке указывает на точное положение символа в регулярном выражении. Убедитесь, что тщательно проверили свой код. Проверьте ваши регулярные выражения на совместимость с PCRE2 синтаксисом через Regex Buddy или другой подобный софт. Дополнительные сведения смотрите в описании PCRE2 синтаксиса и устаревшего PCRE синтаксиса.
Влияние на обратную совместимость
Так как PCRE2 более придирчив и строг к шаблонам, некоторые из ваших preg_match() и подобных вызовов могут не работать. Исправление варьируется от простого обновления шаблона (например, заэкранировать дефисы) до переписывания шаблонов. Убедитесь, что все ваши тесты проходят.
Новые возможности PHP 7.4: стрелочные функции, распаковка в массивах, типизированные свойства
В конце 2019 года вышла новая версия PHP. В этой статье пойдёт речь о возможностях PHP 7.4.
PHP — один из самых востребованных языков программирования. Он широко используется в веб-разработке: на PHP написаны популярные CMS, в том числе WordPress, Joomla!, Drupal. На этом языке созданы фреймворки Laravel, Yii2 и Symfony, которые активно используют веб-разработчики.
Давайте посмотрим, какие инструменты появились у разработчиков после выхода PHP 7.4.
Новая версия делает PHP более выразительным
Версия PHP 7.3 принесла в язык новый синтаксис и производительность. А PHP 7.4 делает код более удобным, читабельным и простым в поддержке. Благодаря этому язык становится быстрее и надёжнее. Ниже описаны основные нововведения версии 7.4.
Стрелочные функции
PHP-программисты давно ждали появления стрелочных функций, похожих на стрелочные функции в JavaScript. Такой синтаксис проще использовать. Однако функции массивов в PHP, известные как короткие замыкания, отличаются от стрелочных функций в JS.
Типизированные свойства PHP
Приведение типов появилось в PHP 5.0. В более поздних версиях эта функциональность развивалась. В версии 7.0 появились типы возвращаемых значений. В PHP 7.4 ввели объявление типов для свойств классов.
Типизированные свойства работают внутри классов и требуют модификаторов доступа. Чтобы лучше понять концепцию, рассмотрим пример.
Распаковка внутри массивов
Распаковка аргументов появилась в PHP 5.6. А начиная с версии 7.4 можно пользоваться распаковкой внутри массивов. Это должно быть быстрее, чем array_merge() благодаря спред-оператору.
В коде ниже видно, как работает распаковка внутри массива.
Присваивающий оператор объединения с null
Слабые ссылки
Эта возможность позволяет разработчикам сохранять ссылки на объекты. Сохранение ссылки не исключает уничтожение объекта. С помощью слабых ссылок (weak references) создаётся подобие кэшированных структур. Пример:
Устаревшие конструкции
С выходом PHP 7.4 часть возможностей языка переходит в категорию устаревших (deprecations). Язык перестанет их поддерживать.
Вложенный тернарный оператор без скобок
Вложенные тернарные операторы лучше не использовать. В таких конструкциях легко ошибиться. Но если вы всё-таки хотите применить вложенный тернарный оператор, используйте его со скобками. Начиная с версии PHP 7.4 вложенные тернарные операторы без скобок считаются устаревшими.
Использование array_key_exists() с объектами
Обращение к индексу массива или строки с помощью фигурных скобок
Использование фигурных скобок для обращения к индексу массива или строки в реальном коде встречается редко. А начиная с версии PHP 7.4 такой код считается устаревшим.
Короткие открытые теги
В PHP использовались разные альтернативы открытым тегам для обозначения начала PHP-кода. Большая часть этих альтернатив была удалена из языка после выхода версии 7.0. Однако некоторые из коротких открытых тегов PHP остались.
Повышение производительности
Главная мотивация перейти на PHP 7.4 — повышение производительности. В версии 7.4 используется предварительная загрузка. Она реализована с помощью расширения Opcache. Это расширение сохраняет в общей памяти предварительно скомпилированный байткод. Благодаря этому не нужно загружать скрипты при каждом запросе.
Opcache работает с опкодом — упрощённым или низкоуровневым представлением PHP-кода. Расширение предварительно компилирует написанный разработчиком код в опкод и загружает в память. Так работает предварительная загрузка.
Этот механизм работает быстрее альтернативы: загрузки файлов при каждом запросе. В конечном итоге благодаря предварительной загрузке растёт производительность PHP 7.4.
Ковариантные возвраты и контравариантные параметры
До выхода версии 7.4 в PHP использовались преимущественно инвариантные параметры и возвращаемые типы. В новой версии вводится ковариантность и контравариантность для типов возвращаемых данных и параметров.
Есть такие типы параметров:
Код ниже показывает ковариантный и контравариантный типы возврата.
О перспективах
В PHP 7.4 появилось не слишком много новых возможностей, поэтому не все разработчики верят в сильное повышение производительности. В сообществе PHP-программистов идут разговоры о версии 8.0, которая принесёт в язык программирования большие нововведения и серьёзно повысит производительность.Тем не менее точная дата релиза PHP 8.0 пока не объявлена.
Адаптированный перевод статьи A Closer Look at PHP’s Latest Version 7.4 by Ruchika Singh Aggarwal. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.