Bad params 2null что это

Самые заметные изменения языка php за последние годы

Я начинал работать с php, когда еще не потерял популярность его 4 выпуск, с тех пор произошли огромные изменения. На мой взгляд, последние несколько лет преобразили разработку на нем. Кстати php продолжает быть серьезно востребованным, например, сейчас “Рексофт” развивает на нем несколько проектов. В одном из них работаю и я. Но перейдем к делу. Делюсь с вами самыми интересными изменениями в php, прошедшими с 5 до версии 8.1.

Одним из самых распространенных классов в веб-разработке я бы назвал сущность User, предназначенную для работы с пользователями. В парадигме MVC ее можно назвать моделью пользователя, которая хранит данные (свойства) и предоставляет доступ к ряду методов работы с ними, а также бизнес-логику, связанную с областью применения класса. На примере такого класса я и хочу посмотреть сам и показать тебе, читатель, как изменился язык php за последнии годы.

Для удобного изменения кода, и чтобы в дальнейшем проще было отслеживать, что в каком порядке менялось, я создал репозиторий на гитхаб. Ссылка на репозиторий: https://github.com/ZhukMax/php-evo. Отразил в коммитах каждый шаг, который ниже постараюсь подробно описать.

Версия 5.6 (Август 2014)

Изначальную версию кода пишем на 5.6, последней стабильной версии php5. Можно было бы рассмотреть и более ранние версии, но это уже скорее история, чем практическая необходимость. Весь код, написанный на php до 5.5, который я встречал в своей практике, скорее требовал серьезного рефакторинга, чем обновления интерпретатора. А порой и полной замены.

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

Пользователь где-то живет, поэтому добавим ему еще свойство “город”, но прежде создаем класс City и затем добавим атрибут в основной класс пользователя, который будет хранить объект нового класса.

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

Версия 7.0 (Декабрь 2015)

Scalar types and return types.

Одним из самых заметных изменений для меня в новой на тот момент версии языка php стала возможность строгой типизации в классах через реализацию скалярных типов и типов, возвращаемых методом данных. Конечно, это не является строгой типизацией в настоящем ее смысле, но все же дает ряд преимуществ, при правильном использовании.

Теперь можно не указывать эти данных в комментариях к методах, потому что они и так обозначены.

Тоже сделаем и с методами, возвращающими данные. Перемещаем тип возвращаемых данных из комментария.

Все изменения, связанные с типами, можно увидеть в коммите 7.0: Use scalar types and return types.

Null coalescing operator

Также в версии 7.0 удобным и приятным стал «синтаксический сахар» проверки на переменной на пустоту через двойной вопросительный знак. Теперь мы можем первую строку ниже заменить на вторую:

Anonymous classes

Также появилась возможность создания и использования анонимных классов. Это позволяет создать объект, реализующий нужный нам интерфейс, без создания отдельного файла класса. В примере ниже я покажу, как это можно использовать в User.

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

Все изменения, связанные со скалярными типами, анонимными классами и типом возвращаемого значения, можно посмотреть в коммите 7.0: Null coalescing operator and Anonymous classes.

Версия 7.1 (Декабрь 2016)

Обнуляемые типы

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

Метод setLogger теперь не требует блока комментария с информацией о типе, его можно удалить:

Остальные правки с этим нововведением в коммите 7.1: Nullable types

Отсутствие возврата и видимость констант класса

Теперь можно ограничивать видимость констант класса. Лично я являюсь сторонником указания видимости в том числе для публичных констант, это улучшает читаемость кода. В общем-то, как и явное указание, что метод не возвращает данных с помощью типа void.

Далее я пропущу версии 7.2 и 7.3, потому что не вижу в них достаточно интересных изменений синтаксиса языка, которые стоило бы упомянуть.

Версия 7.4 (Ноябрь 2019)

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

Стрелочные функции

Это сокращенная форма записи функции с одной строкой кода, результат которой возвращается. Мне они напоминают javascript’овые лямбда функции. Интересным их свойством является видимость внутри тела стрелочной функции переменных из родительской.

В коде класса пользователей я не использовал их, и поэтому ниже покажу пример, которого нет в репозитории. Сначала код на php до 7.4.

Используя стрелочную функцию перепишем код.

Присваивающий оператор объединения с null

Тут все довольно просто, теперь можно писать проверку на NULL и присваивание еще короче.

Версия 8.0 (Ноябрь 2020)

Вариация типов

Иногда требуется, чтобы переменная могла быть не строго одного типа. В классе пользователя я сделал возможность назначать свойство города как объект класса City, так и просто строку с названием. Те, кто пришли из строго типизированных языков, могут сказать, что это плохая идея, но динамические возможности php так прельщают. В общем, я рад появлению возможности объявлять переменную и свойство класса объединенными типами.

Объявление свойств в конструкторе

Ранее мы создали класс города, напомню его:

В версии языка 8.0 мы можем сократить этот код, перенеся объявление свойства класса в конструктор.

Оператор Nullsafe

Очень классная штука, позволяющая сильно упрощать написание цепочки обращений к свойствам и методам класса. Пример из коммита 8.0: Union Types and Match Expression объяснит всю суть нововведения лучше любых слов.

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

Выражение Match

Так метод выглядит сейчас:

Это можно заменить на:

Версия 8.1 (Ноябрь 2021)

Enums (Перечисления)

Во многих языках программирования существуют перечисления. Мы можем их использовать в С++, Golang, Java и других. Наконец, они появились и в php. Здесь они являются особым видом объектов.

Предлагаю реализовать роли пользователя через перечисление, для этого создадим enum Role с дополнительным методом определения аватарки в зависимости от роли. И будем его использовать в классе пользователя.

Теперь можно заменить код в методе getAvatar на использование только что созданного перечисления, отдающего путь к аватарке.

Это очень интересная тема, и тут можно приводить много примеров, но совсем недавно на Хабре Сергей Пантелеев уже публиковал об этом отличную статью.

Readonly свойства класса

Использование модификатора только для чтения (readonly) позволяет добавлять свойства класса, которые недоступны для изменения после инициализации.

Атрибуты

В документации на php.net описан пример создания и использования собственного атрибута. Но также существуют уже созданные, которые можно использовать как для работы кода, так и для улучшения пользовательского опыта при работе с кодом через редактор. К примеру, у IDE PhpStorm есть поддержка ряда существующих атрибутов или созданных нами, помогающих с рефакторингом, подсветкой, автодополнением кода, поиском использований и др.

Я решил, а точнее IDE подсказал, что к одному из методов в User можно добавить атрибут чистой функции #[Pure]. Это значит, что ее можно безопасно удалять, если она нигде не используется. Также редактор будет следить, чтобы мы не нарушали ее чистоты.

Пару слов в заключение

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

Источник

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

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