PHP-Дайджест № 175 (25 февраля – 10 марта 2020)


    Свежая подборка со ссылками на новости и материалы. В выпуске: релизы Laravel 7 и CodeIgniter 4, атрибуты v2 и другие RFC-предложения из PHP Internals, порция полезных инструментов, видео, подкасты и многое другое.

    Приятного чтения!



    Новости и релизы


    • CodeIgniter 4.0 — Спустя 5 лет разработки вышла новая версия фреймворка. Переписан с нуля, но всё так же в виде единого пакета. Работает на PHP 7.2+, реализованы PSR-1,3,4.
    • Ближайшие мероприятия:
      • Ярославль, 12 марта: BeerPHP
      • Санкт-Петербург, 13 марта: BeerPHP SPB Meetup #2
      • Воронеж, 16 марта: 2-й PHP-митап городского чата
      • Екатеринбург, 26 марта: 3-й PHP-митап
      • Казань, 28 марта: 2-й PHP-митап
      skyeng/php-communities — Открытый список PHP-событий, спикеров и организаторов.

    PHP Internals


    • [RFC] Attributes v2 — Вторая попытка добавить полноценные аннотации в PHP с синтаксисом двойных угловых скобок <<...>>. Готов черновик реализации. Ранее уже были предложения о простых аннотациях и атрибутах, последнее предложение как раз не прошло голосование.
      Скрытый текст
      use Doctrine\ORM\Mapping as ORM;
      
      <<ORM\Entity(["repositoryClass" => UserRepository::class])>>
      <<ORM\Table("users")>>
      class User
      {
          <<ORM\Id, ORM\Column, ORM\GeneratedValue>>
          public int $id;
      
          <<ORM\Column(["unique" => true])>>
          public string $email;
      
          <<ORM\ManyToOne()>>
          public ?Address $address;
      }
      
    • [RFC] Increment/Decrement Fixes — Операторы инкремента и декремента в некоторых случаях ведут себя не так же, как явное прибавление/вычитание единицы с присвоением. Например:
      Скрытый текст
          <?php
      
          $a = [];
          $a = ++$a; // [] and no errors
          $a = $a + 1; // Fatal error
          
      В PHP 8 предлагается исправить эти и другие несоответствия и бросать TypeError где необходимо.
    • [RFC] Stringable — Предложение от Nicolas Grekas принято. В PHP 8 можно будет использовать union-тип string|Stringable там, где ожидается строка, и передавать классы с __toString(). При этом интерфейс явно добавлять не нужно.
    • [PR] Make sorting stable — Стандартные функции сортировки в PHP не являются стабильными. Это значит, что оригинальный порядок элементов с одинаковыми значениями не гарантируется (пример). Предлагается это исправить и сделать сортировки стабильными. Правда, при большом количестве одинаковых элементов такой фикс отразится на производительности.

    Инструменты


    • shivammathur/setup-php — GitHub action для добавления в свой воркфлоу, который подготовит среду PHP для дальнейших шагов.
    • minicli/minicli — Пакет для создания консольных утилит. Серия постов в поддержку.
    • cebe/php-openapi — Инструмент читает OpenAPI файлы с описанием сервисов в удобные для работы объекты PHP.

    Symfony



    Laravel



    Yii


    • yiisoft/friendly-exception — Релиз первого пакета из Yii 3. Интерфейс для описания человекопонятных исключений сразу с возможным решением.

    Laminas



    Async PHP



    Материалы для обучения



    Аудио/Видео



    Спасибо за внимание!

    Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
    Вопросы и предложения пишите на почту или в твиттер.

    Больше новостей и комментариев в Telegram-канале PHP Digest.

    Прислать ссылку
    Поиск ссылок по всем дайджестам
    Предыдущий выпуск: PHP-Дайджест № 174

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 24

      +11
      CodeIgniter 4.0 — Спустя 5 лет разработки вышла новая версия фреймворка. Переписан с нуля, но всё так же в виде единого пакета. Работает на PHP 7.2+, реализованы PSR-1,3,4.

      Какой-то «привет из 2008», и больше похоже на пет-проект начинающего разработчика, чем что-то, что можно использовать в своих проектах.
      Всё на статических хелперах, наследовании, protected-полях, массивах, DI даже не пахнет.

      Из интересного сейчас есть Laminas, в частности, Mezzio(бывш. Expressive), с миддлварами из коробки и без http-kernel с его противными «ивентами».
      Но контейнер хочется от Symfony, потому, кажется, проще из неё выпилить http-kernel и впилить миддлвари, чем в laminas нужный контейнер.
        +15
        Интересно, те кто минусуют считают всякое такое:
        Spoiler header
        $hook['pre_controller'] = array(
                'class'    => 'MyClass',
                'function' => 'Myfunction',
                'filename' => 'Myclass.php',
                'filepath' => 'hooks',
                'params'   => array('beer', 'wine', 'snacks')
        );


        Spoiler header
        $this->load->helper('html');
        echo heading('Welcome!', 3, 'class="pink"');
        


        Spoiler header
        public function create()
        {
            helper('form');
            $model = new NewsModel();
        
            if (! $this->validate([
                'title' => 'required|min_length[3]|max_length[255]',
                'body'  => 'required'
            ]))
            {
                echo view('templates/header', ['title' => 'Create a news item']);
                echo view('news/create');
                echo view('templates/footer');
        
            }
            else
            {
                $model->save([
                    'title' => $this->request->getVar('title'),
                    'slug'  => url_title($this->request->getVar('title')),
                    'body'  => $this->request->getVar('body'),
                ]);
                echo view('news/success');
            }
        }


        Spoiler header
        // Create a new class manually
        $userModel = new App\Models\UserModel();
        
        // Create a new class with the model function
        $userModel = model('App\Models\UserModel', false);
        
        // Create a shared instance of the model
        $userModel = model('App\Models\UserModel');
        
        // Create shared instance with a supplied database connection
        // When no namespace is given, it will search through all namespaces
        // the system knows about and attempt to located the UserModel class.
        $db = db_connect('custom');
        $userModel = model('UserModel', true, $db);


        Вот такое в «моделях»:
        Spoiler header
        public function insert_entry()
                {
                        $this->title    = $_POST['title']; // please read the below note
                        $this->content  = $_POST['content'];
                        $this->date     = time();
        
                        $this->db->insert('entries', $this);
                }


        Нормальным кодом в 2020?
        Это, если что, прям из документации codeigniter, и в таком стиле там всё, а не особо неудачные модули.

        Или что «ивенты» с «приоритетами» от симфони лучше явной цепочки миддлварь?
          0
          CodeIgniter по-моему вряд ли себя «отмоет» от репутации «кода на коленке», хотя кому и кобыла невеста…
          +1
          Из интересного сейчас есть Laminas, в частности, Mezzio(бывш. Expressive), с миддлварами из коробки и без http-kernel с его противными «ивентами».

          Вот бы был очень быстрый и компонентный PSR-* фреймворк. С RAD, но без магии. C нормальной ORM и инструментарием для горизонтального масштабирования. Желательно чтобы поддерживался компанией и имел 600 страниц документации. :D

            0
            А не проще самому PSR-фреймворк накатать? Или это ирония?
              0

              Это не ирония (https://spiral.dev/). Через 2-3 недели анонсируем официально.

                0
                Пользуясь случаем:)

                А нет ли в недрах телеграмма (или где-то еще) чатика, куда можно задать вопросы по Cycle? Посмотрел на нее и возникло несколько «а почему так?».

                Например, почему через Repository я всегда заново обращаюсь к БД и надо получать уже выбранные сущности через Heap? Или почему Repository зависит от Select?

                Наверняка это сделано по какой-то причине и решает определенные проблемы. Вот бы были профильные чаты где помогли входящим в проект (тыкнули хотя-бы на страницу доки).
                  0

                  Привет, у нас есть дискорд сервер. Ссылка странице репозитарий. Телеграм ещё не завели, но уже активно думаем в эту сторону.

            0

            Что-то я не понял сложности добавления контейнера от Симфони в Ламинас. Подумал даже, что туплю и перепроверил. У Симфони PSR-11 контейнер — вот https://github.com/symfony/dependency-injection/blob/24918d956cec89aebdf9dd69fc569a980469be3c/ContainerInterface.php#L25


            Laminas поддерживает любой PSR-11 контейнер. Профит

            +3
            В статье Автоматическая настройка Doctrine-репозиториев как сервисов один из заголовков:
            Moving repositories from the entity folder <...> The namespace is now in App\Repository instead of App\Entity.

            Да-да, сущности в / Entity, репозитории в /Repository, сервисы в /Services
            Ну да, ну да, конечно — пошла я, плоская нормальная логическая структура проекта, нафиг :)
              +2
              [RFC] Stringable — Предложение от Nicolas Grekas принято. В PHP 8 можно будет использовать union-тип string|Stringable там, где ожидается строка, и передавать классы с __toString(). При этом интерфейс явно добавлять не нужно.

              Вперед, к утиной типизации!

              Вообще объекты, реализующие __toString() и так можно принять в функцию по хинту string. По моему так и надо делать, если функция собирается работать с параметром как со строкой, то какая ей разница родной это стринг или или объект?

              Конструкции типа string|Stringable будут только засорять код без острой на то необходимости.
                +3
                и так можно принять в функцию по хинту string

                в режиме строгой типизации declare(strict_types=1) не можно (а я не видел проекты большие и современные без него)
                Нужно приводить к строке при передаче
                  –3
                  А я наоборот никогда не юзаю ущербный declare(strict_types=1). Абсолютно бесполезный костыль.

                  Вообще повальное увлечение этой директивой больше похоже на попытку компенсировать свои комплексы. Мол раньше все считали пхпшников говнокодерами из-за слабой типизации. А теперь и у нас есть сильная типизация и можно наконец-то причислить себя к когорте «нормальных» программистов.

                  Реальные проблемы слабой типизации эта дериктива все равно не решает.
                    0

                    symfony можно считать "большим и современным" проектом?
                    declare(strict_types=1) нужен лишь для редких случаев, когда нам кровь из носу нужно не пролюбить какое-то float-string-int приведение (работа с бд, например)

                      +1
                      Фреймворк с большим шлейфом обратной совместимости считать за пример так себе. Ну и да — команда из symfony не особо пролюбила strict_types github.com/symfony/symfony/issues/28423
                      Разрабы доктрины например ЗА строгость явную и настаивают на этом :)

                      Однако обсуждаемое предложение — от основного разработчика Symfony.
                        0

                        тем не менее, они пока так и не реализовали этот фичреквест.
                        не думаю, что у симфони есть проблемы с легаси. в рамках мажорных версий они ее ломают и прекрасно сохраняют чистоту кода.
                        для доктрины понятно использование strict_types (именно из-за нее и упомянул в предыдущем посте работу с БД). Но так же мне приходилось сталкиваться с проблемами вроде той, что описана здесь https://github.com/symfony/symfony/issues/28423#issuecomment-420972515


                        в итоге от использования phpstan будет больше пользы, чем от strict_types. по крайней мере, пока php не оптимизирует свои структуры специально для strict_types.
                        https://github.com/symfony/symfony/issues/28423#issuecomment-419857864

                  0
                  смешанные чувства по поводу аннотаций, вроде уже и не кодить в комментраиях но все еще стремно
                    0
                    не кодить в комментраиях

                    «Кодить в комментариях» ничем не отличается от кодить на «листе блокнота», парсится так или иначе все одинаково, просто на разных уровнях абстракции
                      +2

                      Не понятно чем не понравились аннотации как в java (те, что сейчас в phpdoc)… Обязательно что то новое придумывать?

                        0

                        Но я не говорю, что их надо оставить в phpdoc'e, нет.

                      0
                      Не попали в подборку мероприятий. В СПб в эту пятницу проводим 2-ой митап BeerPHP SPB, ссылка евента и регистрация: www.meetup.com/ru-RU/beerphp_spb/events/269346462

                      Обсуждаем в телеграме: @beerphp_spb (https://t.me/beerphp_spb)
                        0
                        Ссылка на хороший README нерабочая.
                          0
                          Проверил, работает ¯\_(ツ)_/¯

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

                      Самое читаемое