Pull to refresh

Comments 19

отличная подача материала, особенно для не самых опытных разработчиков на слоне (вроде меня)

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

Ну и, получается, стандартные проверки разделились - если в коде работаем с инстансами классов - использую ??, если более атомарные данные - ?:

Большое спасибо за очередную качественную статью о современном РНР.

Какая-то, блин, парадоксальная ситуация - РНР всё так же используется для большинства веб-сайтов, практически весь екоммерс держится на нём - но в публичном поле, и в частности на Хабре, его как будто и нет. Это очень обидно. И при этом интернет всё так же наводнён беспомощными "руководствами" от новичков. Так что тем более важны вот такие статьи от опытных разработчиков.

Статья действительно интересная, одно удовольствие ее почитать и вспомнить, что и как было, тем более, когда уже несколько лет пишешь только на PHP 7, а последний год на PHP 7.4, все версии сливаются как бы в одну и удивляешься, как ты раньше без этого вообще жил.

Но вот этот момент меня смутил:

/**
 * @param City|string $city
 */
public function setCity($city)
{
    $this->city = $city;
}

Да, понятно, что пример синтетический, но очень просто себе выстрелить в ногу таким примером, теперь всегда придется проверять на объект или в сеттере заворачивать строчку в объект или объект приводить к строке. Вообще, еще в PHP 5 появилась такая запись:

/**
 * @param City $city
 */
public function setCity(City $city)
{
    $this->city = $city;
}

Функционал с City|string $city вообще непонятно к чему придумали. Как бы поигрались немного в строгую типизацию и хватит на этом? Если геттер может возвращать объекты разного типа, это здорово может аукнуться на продакшне, когда мы будем ждать объект, а получим строку. Признаюсь, ни разу еще его не использовал и в чужом коде ни разу его не видел. Вот это действительно странный дизайн PHP.

Я это вижу как: мы всю дорогу, начиная с 5й версии шли в сторону строгой типизации, а с приходом PHP 8.0, ой мы свернули не туда, давайте дадим послабления :)

При виде City | string сразу вспоминается symfony form component. Где какая-нибудь опция инпута может быть и строкой, и массивом, и объектом. Да и в serializer component без mixed вроде как не обойдешься.

Спасибо за отличный, подробный комментарий.

Пример из статьи действительно не очень. Но можно сделать как-то так:

public function setCity(City|string $city)
{
    $this->city = $city instanceof City ? city : new City($city);
}

Атрибуты в 8 версии появились.

Как-то обошли вниманием именованные параметры.

Как то они выпали из моего поля зрения, хотя это тоже интересное нововведение.

php продолжает быть серьезно востребованным, например, сейчас “Рексофт” развивает на нем несколько проектов

Масштаб впечатляет...

Понял - блог, где находится статья.

Спасибо за статью! Осталось дождаться, когда concurrency завезут)

Для многих собеседований вплоть до мидла, теперь есть исчерпывающий план разговора и ответов, на тему отличий PHP версии X от Y. ?

Минимум минут на 30, а то и на час ??

Я думал не доживу до появления enum в PHP

Автор, огромное спасибо за статью. Узнал о некоторых полезностях.

При всех своих недостатках, PHP - прекрасно сконструированный язык с простым синтаксисом. И не снижает эту планку годами. Все нововведения логичны и понятны. Пишу это как человек, которому приходится кодить на C++, а PHP использовать "на подхвате" для скриптинга и pet-проектов.

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

Вернуться к C++ после переключения на конфигурирование Linux, скриптинга на PHP/Python, ковыряния Ansible, докручивания ALD, плясок с виртуалками и настройками сетевых объектов инфраструктуры - очень сложно. Начиная от марсианского очень-контекстно-зависимого синтаксиса и заканчивая выявлением опасных действий на ровном месте:

QString line="Any beautiful string";
const char *cLine = fileName.toStdString().c_str();

В C++ все время себя чувствуешь новичком, и только низкоуровневость со скоростью выполнения кода и управлением памятью оправдывает его существование. А как заглянешь в незнакомый код или более-менее крупный проект, так первый вопрос будет: что тут вообще происходит? Как расшифровать вот эту вот строку? Почему эти странные люди пишут ТАК? Кто это будет в состоянии сопровождать?

Надеюсь, PHP еще поживет. Хоть и многословный, но двигается он в правильном направлении.

Sign up to leave a comment.