null safe php 8
PHP 8: the null safe operator
If you’ve used the null coalescing operator in the past, you probably also noticed its shortcomings: null coalescing doesn’t work on method calls. Instead you need intermediate checks, or rely on optional helpers provided by some frameworks:
The nullsafe operator provides functionality similar to null coalescing, but also supports method calls. Instead of writing this:
PHP 8 allows you to write this:
Let’s take a look at what this new operator can and cannot do!
# Nullsafe operator in depth
Let’s start by addressing the most important question: what exactly is the difference between the null coalescing operator and the nullsafe operator?
Let’s take a look at this example:
Here we have an Order object which has an optional relation to an Invoice object. Now imagine we’d want to get the invoice’s number (if the invoice isn’t null). You could do this both with the null coalescing operator and the nullsafe operator:
So what’s the difference? While you could use both operators to achieve the same result in this example, they also have specific edge cases only one of them can handle. For example, you can use the null coalescing operator in combination with array keys, while the nullsafe operator can’t handle them:
The nullsafe operator, on the other hand, can work with method calls, while the null coalescing operator can’t. Imagine an Invoice object like so:
You could use the nullsafe operator to call format on the invoice’s date, even when it’s null :
While the null coalescing operator would crash:
Do you want to learn more about PHP 8.1? There’s The Road to PHP 8.1. For the next 10 days, you’ll receive a daily email covering a new and exiting feature of PHP 8.1; afterwards you’ll be automatically unsubscribed, so no spam or followup. Subscribe now!
# Short circuiting
Short circuiting also means that when writing something like this:
# Nested nullsafe operators
It’s possible to nest several nullsafe operator calls like so:
# Only for reading data
You cannot use the nullsafe operator to write data to objects:
PHP 8: Оператор nullsafe
Безопасный вызов методов
Если вы раньше использовали оператор объединения с нулевым значением (??), вы, вероятно, также заметили его недостатки: объединение с нулевым значением не работает при вызовах методов. Вместо этого вам нужны промежуточные проверки или полагаться на какие-то хелперы, предоставляемых некоторыми фреймворками:
Оператор nullsafe обеспечивает функциональность, аналогичную объединению null, но также поддерживает и вызовы методов. Возьмем для примера следующий код:
В идеальном мире мы могли бы структурировать наш код так, чтобы null был невозможен. К сожалению, мы живем не в идеальном мире, особенно когда нам приходится иметь дело с чужим кодом. По этой причине в ряде языков есть так называемый «оператор nullsafe». И, начиная с версии 8.0, PHP является одним из них. И PHP 8 позволит написать:
Давайте посмотрим, что может и что не может этот новый оператор!
Начнем с ответа на самый важный вопрос: в чем именно разница между оператором объединения null и оператором nullsafe? Давайте посмотрим на этот пример:
Так в чем тогда разница? Хотя в этом примере вы можете использовать оба оператора для достижения одного и того же результата, у них также есть определенные граничные случаи, с которыми может справиться только один из них. Например, вы можете использовать оператор объединения null в сочетании с ключами массива, в то время как оператор nullsafe не может их обрабатывать:
Вы можете использовать оператор nullsafe для вызова format() даты счета-фактуры, даже если она null:
В то время как оператор объединения с нулевым значением выйдет из строя:
Короткое замыкание и isset
А вот оператор объединения null (??) на самом деле является замаскированным isset вызовом своего левого операнда, который не поддерживает короткое замыкание.
Короткое замыкание также означает, что при написании чего-то вроде этого:
Вложенные операторы nullsafe
Можно вложить несколько вызовов операторов nullsafe следующим образом:
Только для чтения данных
Конечно, у оператора nullsafe есть несколько ограничений. Он работает только для чтения свойств или методов, но не для записи значений. Он также не работает с ссылками, потому что ссылки требуют реальных значений. (Это согласуется с другими языками, в которых есть нулевой безопасный оператор.)
Итак, запомните, вы не можете использовать оператор nullsafe для записи данных в объекты, т.е. такая запись не пройдет:
Он также не указывает на то, какой шаг в цепочке вернул null. Возьмем тот же пример с country:
Тем не менее, nullsafe может помочь уменьшить количество шаблонного кода, плавающего вокруг цепочек объектно-ориентированных методов. Мы должны поблагодарить Илью Товило за nullsafe RFC. Оператор nullsafe определенно является нужной, и недостающей частью, наконец добавленной в PHP. Учитывая его динамичный характер, приятно иметь чистый, красивый способ справиться с null.
Поначалу разница и совпадение между оператором nullsafe и оператором объединения null немного сбивает с толку, но к этому легко привыкнуть.
Веб-разработчик со стажем программирования более 9 лет, всегда в процессе учебы и созидания.
PHP 8.0: Null-safe operator
Null-safe operator is a new syntax in PHP 8.0, that provides optional chaining feature to PHP.
In the snippet above, the Customer::getAddress() method return value is nullable; It can return a null value, or an object of Address class.
To safely access the address, it was necessary to check the null return values before further accessing the return value.
Null-safe operator was added to PHP 8.0 between alpha 3 release and first beta release, right around the time PHP 8.0 reached its feature-freeze.
Read-Only
The null-safe operator is read-only. It cannot write/assign values from it.
Chaining
The null-safe operator can be chained, and the expression as a whole will be short-circuited from the first null-safe operator that encounters null.
Evaluated from left to right
The null-safe operator is evaluated from left to right. Most importantly, it does not prioritize other function calls or other access patterns such as array-access.
Note that using braces will make the expression inside the braces execute altogether, as opposed to the left-to-write pattern.
No References
The null-safe operator cannot be used with references.
Backwards Compatibility Impact
Null-safe operator is a new syntax, and cannot be back-ported to older PHP versions.
Running code that uses null-safe operator will raise a parse error:
Ускорение работы и защита от null: представлен PHP 8.0
Вышла в релиз восьмая версия языка программирования PHP. Главные особенности – поддержка JIT-компилятора, появление оператора безопасного null и возможность создавать аннотации в IDE.
Что меняется
Сообщество разработчиков PHP пояснило, что главной целью релиза была оптимизация скорости выполнения языка и добавление новых возможностей. Появилась поддержка дополнительных функций, а часть уже имеющихся были объявлены устаревшими. Поэтому при переходе на версию PHP 8.0 стоит помнить, что некоторые изменения нарушают обратную совместимость с предыдущими версиями языка.
Для упрощения миграции с PHP 7.4.x на официальном сайте php.net создан специальный раздел с документацией, описывающей нововведения и возможные последствия их использования в коде для более старых версий.
Главные особенности PHP 8.0
JIT-компилятор. Разработчики еще в седьмой версии PHP признавались, что выжали максимум возможной производительности. Чтобы еще больше ускорить язык, необходимо использовать JIT-компилятор. Его поддержка реализована в восьмом релизе. Больше всего применение JIT скажется на выполнении математических операций.
Появление аннотаций. Больше не нужно писать PHP-код для фреймворка Symphony на языке комментариев. В восьмой версии появилась возможность при помощи # создавать описания метаданных, проводить рефакторинг и использовать функцию Find usages.
Новый оператор выбора. Для выбора поведения кода из нескольких вариантов в зависимости от значения переменной традиционно используется оператор switch. Теперь вместо него можно применять выражение match, которое позволяет сократить запись. Но оно не полностью заменяет switch и имеет несколько отличий:
Улучшение приведения строки к числу. При нестрогом сравнении строковых и числовых данных старые версии PHP всегда преобразовывают строку к числу. В восьмой версии языка строки и числа будут сравниваться как числа только в том случае, если строка представляет собой число (например, «42»). В противном случае число будет преобразовано в строку. Это одно из изменений, нарушающих обратную совместимость языка. К примеру, иногда для проверки пустой строки «» использовалось ее сравнение с 0. Теперь выражение 0 == «» даст false.
Что нового в PHP 8?
PHP – один из самых популярных языков программирования, широко востребованный при разработке веб-приложений. Гибкий и интерпретированный, доступный и универсальный, PHP поддерживает большинство серверов и более двух десятков баз данных.
Он открывает безграничные возможности для хостинга, ведь применяемые на основе PHP сервисы отлично масштабируются. Несмотря на частую критику инструмента, получившего в упрощенном переводе прозвище «препроцессор», колоссальное количество удачных проектов в своей основе используют именно его. WordPress, Facebook, Drupal и другие проекты создавались с помощью PHP.
Язык PHP имеет много преимуществ:
Недовольство инструментом имеет корни в недалеком прошлом. Простота и доступность для изучения привела к тому, что на PHP создавали страницы, приложения все, кто хоть что-нибудь понимал в программировании. Это приводило к распространению некачественных программ и веб-ресурсов.
PHP имеет и реальные недостатки. Это узкопрофильная разработка, предназначенная исключительно для программирования для сети Интернет. К недостаткам относятся также противоречивость кода, погрешности безопасности.
Вкратце о нововведениях в PHP8
Востребованность в совокупности с уязвимостью языка провоцирует постоянное обновление и усовершенствование PHP. Некоторое время назад мы рассказывали о нововведениях в PHP 7.4, однако уже в ноябре 2020 года состоялся выпуск версии PHP 8. Усовершенствованный вариант имеет ряд преимуществ. Рассмотрим, какие возможности были добавлены разработчиком:
Union Types
Совокупность нескольких типов, указывающих на возможность использования любого из них, представляет собой функцию Union Types. Новая версия PHP позволяет использовать объявления Union Types, проверка которых осуществляется моментально, одновременно с выполнением. Такая возможность появилась взамен аннотаций PHP docs.
Компилятор Just In Time, именуемый JIT, оптимизирует производительность процессов во время работы программ, приложений и т.д., благодаря динамической компиляции. Первоочередно код транслируется в промежуточное представление, затем в машинный код. Выполнение происходит на процессоре, без использования виртуальной машины.
Nullsafe-оператор
Прежняя система, при работе с оператором null, демонстрировала неудобное свойство: невозможность применения в цепочке вызовов методов. Возникала потребность в промежуточных проверках или в применении помощников.
Внедрение Nullsafe-оператора позволяет разработчику наблюдать поведение методов.
Именованные аргументы
Именованные аргументы открывают возможность передачи значения в функцию путем указания имени значения. Для разработчика это способ оптимизировать рабочий процесс, и спокойно без потерь пропускать второстепенные по значимости параметры. При этом порядок аргументов больше не имеет значения.
Атрибуты
Атрибуты предоставляют возможность добавления метаданных с нативным синтаксисом PHP в классы удобным способом. Данная опция позволяет разделить абстрактную реализацию некоторой функции и ее кодовое использование. Атрибуты – это новые возможности и технически более совершенный способ добавлять дополнительную информацию и конфигурацию.
Выражение соответствия
Новинка PHP 8 – match. Это выражение с возможностью сохранения в переменной либо возврата. Новые условия позволяют применять исключительно однострочные выражения без использования конструкции break.
Новый тип mixed
В процессе эволюции PHP разработчиками добавлялись новые категории типов – скалярные, обнуляемые. В новой версии появились типы класса mixed – смешанные. Смешанная категория позволяет добавлять типы в параметры и свойства, может применяться как тип возвращаемого значения, а также использоваться как параметр или тип свойства.
Throw-выражения
Обновленная версия позволит преобразование в выражение инструкции throw – в предыдущих выпусках такой опции не было. Такое нововведение расширяет возможности использования инструмента.
Weak maps
Восьмая версия дополнена классом WeakMaps, позволяющим сохранять ссылку на объект. При этом сам объект можно свободно удалить.
Неименованные исключения
В прежних версиях перехват исключения был возможен с предварительным сохранением его в переменной. При этом не имело значения, использовалась ли переменная. PHP 8 позволяет перехватывать исключения, указание переменной при том не требуется. При этом следует иметь ввиду, что тип нужно указывать обязательно: PHP 8 не предусматривает возможность оставлять пустой catch.
Новые возможности PHP 8
Помимо добавленных для разработчиков возможностей, версия PHP 8 дополнена рядом других существенных изменений (деление на ноль, возвращение типа переменной, идентификация ресурса и т.д.).
С полным списком изменений в версии PHP 8 вы можете ознакомиться на официальном сайте.
PHP 8 на хостинге SpaceWeb
PHP 8 для действующих клиентов хостинга SpaceWeb
PHP 8 для новых клиентов
Хотите протестировать работу своего сайта на PHP 8 одним из первых? Заказывайте виртуальный хостинг в SpaceWeb — у нас PHP 8 уже доступен на любом тарифе! При необходимости мы можем бесплатно перенести ваш сайт к нам на хостинг. А бесплатный тестовый период в 14 дней позволит вам не спеша провести тестирование сайта на самом современном оборудовании и программном обеспечении.
Топ-6 сервисов для проверки кроссбраузерности сайта
NVMe SSD диски — обзор технологии
10 инструментов сжатия изображений
Надежный хостинг для сайта с бесплатным доменом и SSL за 159 ₽
Надежный хостинг для сайта с бесплатным доменом и SSL за 159 ₽
Стань партнером
Выгодное предложение SpaceWeb:
© 2001-2021 ООО «СпейсВэб» Все права защищены.
Лицензия на предоставление телематических услуг связи № 163230.
Стань партнером
Выгодное предложение SpaceWeb:
© 2001-2021 ООО «СпейсВэб» Все права защищены. Лицензия на предоставление телематических услуг связи № 163230.
Общество с ограниченной ответственностью «СпейсВэб». Генеральный директор: Шпагин А.Ю. Юридический адрес: 198095, город Санкт-Петербург, улица Маршала Говорова, дом 35, корпус 5, литер Ж, этаж 4, офис 371. Адрес офиса: 198095, Санкт-Петербург, ул. Маршала Говорова, д. 35, корп. 5, лит. Ж, бизнес-центр «Терминал», офис 401.