Почти 8 месяцев тому назад я пересел с проектов python/java на проект на php (мне предложили условия от которых было бы глупо отказываться), и я внезапно не ощутил боли и отчаяния, о которых проповедуют бывшие разработчики на ПХП. И вот что я думаю по этому поводу.



Что есть что


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

Python. Когда речь заходит о проектах на python (чаще всего на Django), мы получаем платформу, которая позволяет достаточно удобно и просто наращивать функционал, строить rest-api сервера, проводить шардирование системы и прочее. Логика работы фреймворка очень понятная и прямолинейная. Даже совсем зеленый разработчик может за пару часов набросать небольшой бложик с админкой. Плюс документация Django – одна из самых качественных, что я видел. К этому всему добавляется синтаксический сахар python, который помогает реализовывать определенные паттерны весьма элегантно. Если мы отходим от Django в сторону Tornado/aiohtpp/Twisted/Flask итд – то там начинается боль, ибо код в них писать гораздо неприятней, чем в Django.

Java. Если мы говорим про Java, например, Spring – то это системы, которые вызывают анальную боль тем, что заставляют тебя конфигурировать все, что можно конфигурировать. Порог вхождения очень высокий, огромное число нюансов, которое нужно держать в голове, плюс сам синтаксис Java заставляет тебя писать весьма объемные конструкции (правдиво для всех проектах на шестой Java). Но в качестве награды мы получаем весьма надежные и гибкие системы, которые могут пережить не один десяток программистов с весьма посредственными руками.

Что же касается PHP


Перед началом работы я прочитал книгу: Мэтт Зандра – PHP объекты, шаблоны и методики программирования, и убедился, что PHP в общем-то без особой боли позволяет реализовывать те или иные паттерны разработки. Т.е. в PHP можно писать правильный код, который будет не сильно отличаться от того, что мы получаем на Python/Java.

Zend Framework 1


Проект внутреннего сервиса меня встретил Zend Framework 1 на PHP 5.3. Скажу сразу, что многие решения на данной платформе выглядят весьма спорно, а язык PHP 5.3 имеет ограничения на установление типа возврата функций (методов), тем не менее, достаточно быстро понимаешь, где что лежит, как что прокидывается, а как что формируется.

Например, если мы рассматривает Zend Forms, то они практически под копирку делают то, что делают классические формы в Django. Синтаксис построения запросов в ДБ Zend DB Table – не вызывает какого-то негатива, и весьма очевидно работает.

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

Symfony 3.4


Спустя 3 месяца меня перевели на другой проект на Symfony 3.4 и PHP 7.1 – и вот это просто бомба. У меня откровенно было ощущение, что мне дали в ручки Django, куда добавили надежность системы из Java.

  • Шаблонизатор Twig – полный клон Jinja от Django.
  • Doctrine ORM – аналог Hibernate
  • Аннотации Symfony – аналог декораторов из Python
  • Auto-wiring Symfony – даже работает очевидней, чем DI в Spring
  • Очевидные конфигурации секрьрности
  • Удобное построение rest-APi клиентов.
  • Удобное написание джоб для крона (в данном случае в симфонии они называются консольные команды)
  • Удобный дебагер и консольный помощник.

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

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

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

А есть ли разница


Также хочу отметить такой момент, что после того, как ты поработал на 3-4 современных веб-фреймворках, тебе приходит понимание, что все везде работает схожим образом. Отличаются названия и реализации, а общие концепции 1 в 1. Поэтому, скажем, если вы работали на Django, то пересесть на php Symfony / .Net CORE MVC – можно без особо труда за пару месяцев.

P.S.: если я все же слеп и глуп, прошу в комментарии.

Комментарии (353)


  1. apapacy
    26.03.2019 14:20

    Doctrine ORM – аналог Hibernate

    Хотя я не разрабатываю реальные проекты на на Symfony, но могу сказать что Doctrine ORM имеет по крайней мере две фичи которые не повторила ни одна crm
    1) Автогенерация миграций, которые потом можно дополнятть своим кодом. При этом текущее состояние программного кода сравнивается с текущим состоянием базы данных. Аналоги есть. Но там такие варианты
    — автомиграции в стиле sync nodejs-siquelize — когда не управляешь ничем и orm частично изменяет на лету структуру базы данных
    — автомиграции в стиле go-kallax — когда генерируется некоторая промежуточная структура данных в которой делается слепок текущего состояния струкуры базы данных. И миграция генерируется не от текущего состояния базы данных а от этого состояния снимка базы данных, которое может и не на все 100% соответствовать текущей структуре базы данных
    — автомиграцми в стиле liquibase-hibernate — когда сравнивается текущее состояние базы даных и текущая схема данных, но генерируется не программный код а документ xml. То есть миграция изменит схему но нет возможности кастомизировать миграцию свое йлоггико миграции

    2) локализованные текстовые поля. Для локализации достаточно задать в схеме аннотацию что поле переводимое и все. Дальше модно работать как юудто бы с плоской таблицей но поле будет переведено на нужную локаль.

    Некоторое время назад недоставало инструментов для быстрого создания админок (типа Django) но на сегодняшний день они уже есть.


    1. Magister7
      26.03.2019 14:54
      +1

      Автогенерация миграций, которые потом можно дополнятть своим кодом.

      Django же. Правда сравнивается текущее состояние программного кода с прошлым состоянием его же, но минусом это не считаю, т.к. с чего бы прошлому состоянию не соответствовать базе?


    1. andreymal
      26.03.2019 15:00
      +1

      И миграция генерируется не от текущего состояния базы данных

      Миграция должна генерироваться от состояния предыдущей выполненной миграции, как в Django. А это состояние должно полностью соответствовать состоянию базы данных: если не соответствует, то это какой-то неконтролируемый трындец, работать с которым опасно


      локализованные текстовые поля

      В той же Django из коробки действительно нет, но нетрудно написать вручную (я для одного своего проекта недавно писал как раз) (можно по желанию опубликовать реализацию на PyPI, чтобы всем остальным не приходилось вручную писать — возможно, кто-то уже даже опубликовал, я не проверял)


    1. Perlovich
      26.03.2019 16:09

      Doctrine ORM имеет по крайней мере две фичи которые не повторила ни одна crm

      1) Автогенерация миграций, которые потом можно дополнятть своим кодом.

      2) локализованные текстовые поля


      Ну это вы зря. В нашей компании, например, для Java разрабатывают CUBA.platform. К ней есть Studio в виде плагина к Intellij IDEA, которая и миграции позволяет генерировать/менять, и поля локализировать.

      Если что, не реклама. Я к созданию/поддержке фреймворка отношения не имею. Работаю в другом бизнес-подразделении.


      1. vidyakinsergey
        27.03.2019 11:43

        CUBA это жалкая попытка портировать 1С на яву ))


      1. apapacy
        28.03.2019 12:44

        CUBA.platform насколько я понимаю это уже не бесплатно хотя возможно и хорошо. Что касается платных продуктов (или же закрытых внутрикорпоративных продуктов например то что использует у себя внутри Google или Facebook и никому не продает за деньги) то я вполне допускаю что могут быть и более продвинутые решения.


        1. Perlovich
          28.03.2019 21:19

          CUBA.platform насколько я понимаю это уже не бесплатно


          Нет, на самом деле, совершенно наоборот. Многое из того, что раньше было платно, стало бесплатным. Значительная часть функционала студии сейчас бесплатна, независимо от величины проекта. Также сделали бесплатным многие плагины (например, гугл-карты, чарты) и выложили их source code на гитхаб.


    1. A1ien
      26.03.2019 23:39

      На счёт миграций, EntityFramework же, умеет все и по-всякому...


      1. FreeBa
        27.03.2019 03:42

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


      1. hatman Автор
        27.03.2019 04:41

        Кстати, EntityFramework Core уже взял все фичи от оригинального EntityFramework или еще есть пропасть по функционалу?


        1. questor
          27.03.2019 10:08

          Ну, для средней работы всё давно на месте, но бывают фичи, которые были и до сих пор не перенесены. Помнится, я ждал выхода ef core 2.? ради какой-то штуки, которая понадобилась и как назло не было. Ни в 2.1 не было, ни в 2.2, поэтому так и остался воркэраунд.

          А вообще — сильно зависит от того, что вам нужно в вашем проекте. Почитайте например здесь changelog docs.microsoft.com/ru-ru/ef/core/what-is-new/ef-core-2.2 и лог предыдущих версий.


        1. impwx
          27.03.2019 13:21

          Некоторые редкоиспользуемые фичи все еще отсутствуют — например, связь «много ко многим» без промежуточной таблицы. В целом же EF Core 2.2 вполне «взрослый» и готовый к продакшену.


    1. olegchir
      27.03.2019 02:40

      > не программный код а документ xml

      1) миграция производится не для 1 конкретной базы данных, а для всех-всех-всех. Синтаксис SQL может и будет отличаться. Из XML генерится разный SQL в зависимости от ситуации.

      2) свой SQL в Liquibase писать можно. Хотя это боль и унижение, потому что смотри пункт 1 — оно будет непортируемо между разными БД


      1. poxvuibr
        27.03.2019 09:21

        свой SQL в Liquibase писать можно, но будет непортируемо между разными БД

        Свой sql писать придётся, потому что понадобятся фичи, специфичные для используемой СУБД.


      1. apapacy
        27.03.2019 10:37

        В doctrine генерится не sql а php поэтому кастомизируктся миграция средствами orm и поэтому переносимая между базами данных


  1. VolCh
    26.03.2019 14:53
    +3

    Как мне кажется, больше всего хейтят PHP те, кто ушёл с него где-то на 4 версии, максимум с 5.2. Или те, кто в основном работал в єкосистеме WordPress и Joomla. Собственно оба варианта почти одно и то же, пускай и во втором формально последний PHP сейчас поддерживается.

    P.S. А аналог Doctrine (DataMapper ORM) появился? Или всё разновидности ActiveRecord?


    1. Warrangie
      26.03.2019 19:08
      +3

      Вы так мастерски объяснили почему хейтят php и так лицемерно сделали то же самое с двумя популярными cms.
      Php хейтят по инерции, причем в основном те, кто его не использует и те, кто его использует, но не знает толком. На хабре периодически появляются статьи вида "ухожу из пхп потому что он не очень" от ребят, которые толком не знают о чем пишут.
      А про джумлу — будьте добры, изучите хоть немного то, о чем говорите. А то получается что вы осуждаете людей за собственные ошибки и не видите этого. Есть масса отличных разработчиков, которые пишут под джумлу и масса хреновых, которые используют {подставить имя} фреймворк, а вы сейчас всех под одну гребёнку, неприятно, знаете ли. Почему вы считаете что если человек пишет не под ту систему, во вам нравится, то он априори не очень?


      1. HEKET313
        26.03.2019 20:20

        А где в комментарии выше высказывание, что те, кто пишут под джумлу и wp не очень? Там конкретно про эти фреймворки написано. Я не работал под Joomla, а проекты на wp обходил стороной, весьма не приятные воспоминания он оставил в последний раз, когда я с ним работал. Если я правильно понял посыл автора предыдущего комментария, то в этот ряд можно так же добавить ещё и Bitrix, в котором globals повсеместно использовались ещё года так 2-3 назад и проблемы с поддержкой 7х версий были, не знаю как сейчас, благо ушёл с него и забыл как страшный сон. И я бы тоже хэйтил PHP, если бы знал только про Bitrix, потому что нормальным программированием там не пахнет: SOLID, DI — это не сюда.


        1. sumanai
          26.03.2019 21:51
          +1

          Bitrix, в котором globals повсеместно использовались ещё года так 2-3 назад

          Там и сейчас без globals никуда (


        1. Alexufo
          27.03.2019 17:19

          вы не поверите, но клиентам все равно что вам нравится глобалс или нет. А кушать эту каку всегда есть кому когда за нее неплохо платят.


      1. vdem
        26.03.2019 23:42
        +2

        Достаточно глянуть исходники WordPress чтобы понять какое это г-но. Популярным он стал потому что альтернатив быстро запустить свой сайт в свое время не было, а сейчас многим дешевле и дальше с ним с кривыми плагинами мучиться, чем переписать всё под фреймворк. Вот если б они его полностью с нуля переписали. Показатель — хотя бы количество проектов на Upwork, где у заказчиков проблемы с WP (в моей ленте это где-то 30-40% от всех). Насчет Joomla не знаю.


        1. Alexufo
          27.03.2019 13:13

          Это не так. Он развивался в среде когда слева была джумла, справа modx, сверху ещё что-то, внизу тоже. CMS был зоопарк! Выбирать точно было из чего. Выстрелил он потому что думал об удобстве для потребителя, а не соблюдении паттернов ради паттернов.

          Архитектурные ошибки именно и тянутся что о пользователе продолжают думать, чтобы не ломать обратную совместимость. Нет зоопарка версий. Есть строгие предупреждения перед обновлением, что сломается что-то такое. Пресс давно поддерживает json API, а его кривую архитектуру абстрагируют реактом. У меня подозрение, что в будущем однажды подменят ядро воссоздав идентичный API.
          Там есть вещи дико выбешивающие меня, например, создание нового размера изображений заставит все загруженные файлы обрезаться в копию. Отсюда тонны лишних не используемых изображений.


        1. kester
          27.03.2019 13:19

          альтернатив быстро запустить свой сайт в свое время не было

          Да ну? Всяких CMS всегда было много. В том числе с минимальными требованиями и удобными установками.


          1. Source
            28.03.2019 00:24

            У WordPress была чёткая ниша — блоги. В ней он и выстрелил. А потом уже обросло всё плагинами.


      1. vlreshet
        27.03.2019 10:46

        Так а почему бы их не хейтить? В отличие от PHP, их качество никуда не выросло, как был там жуткий говнокод под капотом, так и остаётся.


        1. Warrangie
          27.03.2019 11:22

          Наверное потому что речь о «тех, кто в основном работал в єкосистеме WordPress и Joomla» именно в том контексте что эти люди больше всего хейтят пхп, а не про качество кода самих CMS?
          Не скажу про вп, я один раз посмотрел на его код и больше никогда к нему не возвращался. Но под ждумлу я пишу последние два — два споловиной года, не только под нее, конечно, zf3, laravel, yii2 тоже использовал.
          У джумлы есть проблемы только с доками из-за чего под нее сложно начать писать нормально. Но сам ее код не так уж и плох, вполне себе читается и дебажится. Проблемы есть, разумеется, но они со временем уходят.


          1. Alexufo
            27.03.2019 13:16

            И как показывает практика, доля wp растет. Как растет Битрикс тоже страшно. При всем при этом первому прастительного ибо он бесплатный.


      1. VolCh
        27.03.2019 13:03

        Я лишь констатировал факт, что встречавшиеся мне продакшен-системы на WordPress и Joomla, которые пытались мне спихнуть на поддержку или развитие были написаны в стиле PHP4, если вообще не PHP3. PHP 5 и 7 в них поддерживались (хорошо если логи не засорялись depricated), но их фичи не использовались.


    1. GreyStrannik
      26.03.2019 22:29
      +2

      PHP хейтится за уровень разработчиков, за низкий порог входа. Это до сих пор так. Но в тот же Symfony порог входа весьма высок и средний уровень разработчиков на нём сильно выше, чем в среднем по PHP.


    1. isden
      27.03.2019 09:30

      Ну я застал проекты еще на PHP3 :|
      И не то чтобы прямо хейт такой, просто открывая любой код на PHP, я всегда вспоминаю всю ту боль. Особенно в сравнении с другими ЯП.


      1. VolCh
        27.03.2019 13:06
        +1

        Я тоже застал, но теперь открывая современный код на современном PHP испытываю удовольствие. Я закрыл психическую травму, нанесенную PHP3 :)


    1. tehSLy
      27.03.2019 11:07

      Так после 5.6 у него был тот самый прорыв на 7ку, а в итоге — ничего
      пхп хейтят за его стремление сесть на оба стула в попытке «погони» (очень громкое слово, самому смешно) и за новыми фичами и за обратной совместимостью, в итоге получается что то среднее между ежом и ужом, вроде уже и не так колется, но все еще противно.
      (Баги, висящие на багтрекерах годами, причем достаточно весомые, инертность языка, отсутствие конвенций в именованиях, очередности аргументов, все то, что уже проговорено 1000 и 1 раз)
      ((Сам сейчас веду проект на пхп, Laravel, все bleeding-edge версий, как был простым как палка, так и остался, за попытку отстрелить себе ногу никто ничего не скажет))


    1. xPomaHx
      27.03.2019 20:22
      -4

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


      1. sumanai
        27.03.2019 20:50
        +5

        разные операторы сложения и конкатенации

        Странно слышать это от JSсника. Это же божественно. Нет ошибкам типа
        2 + '2'
        22
        2 - '2'
        0


  1. vril
    26.03.2019 15:02

    К слову Symfony 4 намного удобнее третьей ветки. Я PHP как язык не очень люблю, но Symfony 4 просто волшебная. Рекомендую.


  1. sshikov
    26.03.2019 15:36

    >правдиво для всех проектах на шестой Java
    Вообще-то, даже Java 8 уже legacy. Как-то странно так вот сравнивать, если вы конечно имели в виду Java SE 1.6, вышедшую в 2006 кажется году.


    1. akurilov
      26.03.2019 21:14

      Вообще как то всё очень поверностно. Ништяки Java — это не только исключения и возвращаемые типы. Автор, судя по всему, не имел вменяемого знакомства с Java


      1. gdt
        26.03.2019 21:56
        -1

        Неужели дженерики нормальные наконец завезли? Так-то в java отсутствует очень много ништяков, которые есть, например, в c#.


        1. vics001
          27.03.2019 23:51

          Дженерики «нормальные» это про что? Не испытываю проблем, что дженерики compile-time, да и есть конструкции для runtime, но на практике не возникает необходимости.


          1. gdt
            28.03.2019 08:01

            Если вы не испытываете проблем — это не значит, что их нет. Например, в проекте, над которым сейчас работаю, мы активно используем рефлексию и дженерики. Я не эксперт в java, но думаю, что в связи с type erasure повторить это на java очень сложно (если вообще возможно)


            1. vics001
              28.03.2019 17:35

              После 10 лет опыта, я встречал очень много и очень разные ситуации, чтобы сейчас сказать, что такой проблемы в большинстве случаев нет.
              И да, рефлексия это уже плохо, потому что подрывает многие концепции compile-time проверок. Рефлексия должна использоваться в редких случаях.

              Когда, в Java 1.5 вышли дженерики, кто только не говорил, что все это сделали лишь бы не менять байткод. На самом деле, байткод менять не нужно было и это сделано намерено. В Java давно существует RuntimeException TypeA[] a[0] = TypeB(); и его вполне можно отлично использовать. Так же есть Collections.checkedCollection, checkedMap… На пару проектов я использовал, но потом понял, что снижает performance и никаких багов в принципе не ловится, так что отказался.

              Ответ один, лучше всего когда ошибки видны, чем раньше, тем лучше, а именно compile-time. Отлавливать что-то runtime моветон и в Java уже существует древняя проблема NPE как раз из-за недостатка compile time checks.

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


              1. gdt
                28.03.2019 17:57

                Рефлексия не обязательно означает отсутствие compile-time проверок.
                Давайте рассмотрим такой пример. Представим себе, что одному приложению необходимо генерировать и отправлять события. Получателю события уходят в формате, например, json, т. е. надо в коде как-то этот json формировать и отправлять. Событий конечное количество, но достаточно много, и периодически появляются новые и могут меняться старые. Набор атрибутов в целом у каждого события произвольный. Разные события могут обрабатываться по факту разными получателями, т. е. у них могут быть свои требования к формату значений. Типы данных значений в целом произвольные, есть вложенные структуры и коллекции.
                А теперь внимание вопрос — как обеспечить типобезопасность таких событий? Делать руками json на каждый чих очевидно не вариант, передавать куда-то словарь <string, object> тоже не лучше — рано или поздно на проект придёт новый разработчик, напишет «null» вместо null или наоборот (и это самый простой кейс) и кто-то поимеет очень много головной боли.
                А есть такой вариант — описывать события в виде контрактов (интерфейсов). Есть класс (покрытый тестами с ног до головы), который в runtime генерирует по интерфейсу реализации, умеет реализовывать коллекции (в том числе коллекции контрактов с коллекциями и тд), учитывает возможные атрибуты (которые определяют дальнейшие преобразования данных, например, формат даты/времени). Дальше такой объект передётся другому классу, который знает, что можно отправлять, а что нет, и который раскладывает объекты в нужное представление и отправляет получателю (это в первом приближении, всё гораздо более гибко). Таким образом, вы у себя в коде пишете что-то вроде

                var evt = DataContract.Create<IMySuperEvent>();
                evt.PropertyOne = 1;
                evt.PropertyTwo = "two";
                evt.PropertyThree.Add(DateTime.Now);
                ...
                
                await _tracker.Track(evt);
                

                Ничего лишнего, просто, удобно, типобезопасно, все довольны. Можно ли так сделать на java?


                1. transcengopher
                  28.03.2019 18:33

                  Кхм. А если вот так?


                  IMySuperEvent evt = DataContract.make(IMySuperEvent.class);
                  evt.setPropertyOne(1); // звиняйте, пропертей не держим
                  evt.setPropertyTwo("Two");
                  // а это чтоб прокси колекций не делать, хотя тоже можно
                  evt.addPropertyThree(LocalDate.now());
                  
                  /*... Somewhere in a galaxy far away */
                  class DataContract {
                    public static <T> T make(Class<T> cls) {
                      return Proxy.newProxyInstance(
                          cls.getClassLoader(),
                          new Class<?> []{cls},
                          new DataPropertiesImplementation()
                      );
                    }
                  
                    private static class DataPropertiesImplementation implements InvocationHandler {
                       /* ... а вот тут ваш покрытый по самые помидоры тестами код, но на самом деле может быть и обёртка над HashMap ...*/
                    }
                  }

                  Все методы интерфейса распознаются в соответствии с Java Beans 1.0 Spec, но в принципе реализация на усмотрение.


                  1. gdt
                    28.03.2019 18:43

                    Неплохо вы меня уделали :) Это не совсем одно и тоже, но идея та же самая, согласен. Вообще дженерики просто первое, что в голову пришло. Вот например те же проперти или события, а точнее их отсутствие — встаёт непреодолимой преградой в освоении java. Я честно пытался несколько раз, но после C# совсем не то пальто.


                    1. transcengopher
                      28.03.2019 19:21

                      Ну так и начинать стоило со свойств и событий, а то начали с прокси и рефлексии.
                      Причём, по моему мнению (с учётом ограниченных знаний, само собой), оба преимущества в экосистеме Java можно в определённых пределах имитировать, например, лямбдами.
                      И без свойств как таковых вполне можно обойтись — это скорее сахар над парой методов, чем именно что-то полезное до незаменимости. Хотя я вполне понимаю как такие мелочи могут портить впечатление от разработки, если уже привык. Я вот привык, что их нет, и просто делаю код. Когда их в Java добавят — порадуюсь, не добавят — ну что ж поделать, судьба такая.

                      Хотя мне и не нравятся соглашения о наименовании в C# — имя типа и имя метода должны быть различимы даже без подсветок синтаксиса, а в C# они именуются по одному и тому же шаблону; Но это вкусовщина, скорее) — я, впрочем, не буду отрицать в целом превосходство C# над Java — язык более молодой, смог учиться на ошибках и брать лучшее, плюс в раннем возрасте смог сбросить груз некоторых плохих решений в API стандартной библиотеки.
                      По этой же причине Ceylon, как я считаю, может превосходить их оба, только за счёт системы типов. Но так как я пока что не видел его подводных камней, — «может», не «превосходит».


                    1. vics001
                      28.03.2019 22:34

                      То, что вы говорите, что у Generic не хватает описания конструкторов и их нельзя создать не выходя в рефлексию. Очень странно, но вот такой код распространен и дает отличный результат.

                      public <T> T newInstance(Class<T> cl) {
                           /// reflection constructor
                      }
                      
                      IMySuperEvent ie = newInstance(IMySuperEvent.class);
                      ie.setProperty(...);
                      
                      

                      Недостаток что до сих пор это нельзя сделать без полной рефлексии и с compile time проверками, то есть нельзя написать <T has constructor ()>. С другой стороны, все очевидно, что для работы коллекции или сервиса нужен Class в runtime.

                      Property — вопрос исторический, их нет и уже огромная практика по get/set генерации. К этому можно быстро привыкнуть. И ко всем классам пишешь get/set, а если не пишешь подразумеваешь, что метод чисто data-structure. То есть либо везде, либо нигде, в принципе по количеству кода получается ненамного больше, но структурирует.

                      С появлением нормальных делегатов в Java 8 и Stream API, вопрос событий можно считать закрытым, потому что их очень просто писать с помощью делегатов и Lambda.


    1. franzose
      27.03.2019 00:12

      Вообще-то, даже Java 8 уже legacy

      Однако большинство проектов всё еще на ней. И еще долго будут, судя по тому, как часто теперь выпускаются релизы.


      1. Skerrigan
        27.03.2019 06:39

        На сегодня уже доступен как пол-года новый LTS — v11. Проект, над которым работаю последние лет 5, уже на новом LTS.
        В других фирмах, где серьезные Java-проекты, тоже переползают на v11.


      1. sshikov
        27.03.2019 11:28
        +1

        Дело в том, что автор пишет про Java 6, а не 8. Тех, кто сегодня сидит на 6, можно пожалеть, но уж точно не стоило сравнивать PHP сегодняшний, 7.х, с такой старой версией.


  1. ZurgInq
    26.03.2019 15:47
    +1

    Symfony 4:


    • Документация местами ужасна, в том числе навигация по документации.
    • Конфиги, конфиги и ещё раз конфиги. С десяток конфиг файлов в установке с нуля. Куцая документация добавляет боли.
    • Аннотации — в сложных случаях вырождаются в программирование на комментариях.
    • Сплошная магия во всех ключевых компонентах (сериализатор, валидаторы, секьюрити) — одна не осторожная строчка в конфиг файлах, или неправильно написанная аннотация, и без пошаговой отладки уже не разобраться. И собственно сами "магические" методы, которые так ругают в других фрэймворках, их здесь кажется даже в разы больше чем в Laravel, только они спрятаны более тщательно.


    1. EvgeniiR
      26.03.2019 17:22
      -3

      Конфиги, конфиги и ещё раз конфиги. С десяток конфиг файлов в установке с нуля. Куцая документация добавляет боли.

      Напишите сходу 10 конфигов? Где их меньше? Какие альтернативы конфигам предлагаете?

      Аннотации — в сложных случаях вырождаются в программирование на комментариях.

      В каком месте Sf4 принуждает вас юзать аннотации?

      Сплошная магия во всех ключевых компонентах (сериализатор, валидаторы, секьюрити) — одна не осторожная строчка в конфиг файлах, или неправильно написанная аннотация, и без пошаговой отладки уже не разобраться

      см п.1


      1. ZurgInq
        26.03.2019 17:52
        +1

        Напишите сходу 10 конфигов? Где их меньше? Какие альтернативы конфигам предлагаете?
        Convention over configuration. Можно посмотреть в том числе на lumen, или любой другой api фрэймворк.

        В каком месте Sf4 принуждает вас юзать аннотации?
        Официальная документация и инструменты (в том числе кодогенерации) по умолчанию форсят аннотации. Можно перейти с программирования на аннотациях на программирования через конфигурации, но легче от этого не станет, yml файлы ни чем не лучше аннотаций. Последний вариант — конфигурация через php код, тут хотя бы будут подсказки по коду.


        1. EvgeniiR
          26.03.2019 18:17

          тут хотя бы будут подсказки по кодa

          У меня и в Аннотациях подсказки работают, так что не вижу разницы(да и с конфигами, вродь, не возникает проблем), а если там вот такое:
          $app->get('{id}/posts/{postId}', ['uses' => 'UsersController@getUserPost', ]); — нет по сути разницы где это описывать, автокомплита ни там ни там не будет

          Официальная документация и инструменты (в том числе кодогенерации) по умолчанию форсят аннотации.

          Точно так же они форсят бездумно пихать геттеры и сеттеры в сущности, класть их все кучей в App\Entity etc., что не мешает всего этого не делать. В принципе не самый приятный момент, но тем не менее вполне неплохая кодогенерация есть, Laravel с кодогенерацией из коробки всё ж не лучше, хоть и не плох.


        1. tendium
          26.03.2019 21:57
          +4

          тут хотя бы будут подсказки по кодa

          PhpStorm с соответствующим плагином всё нормально подсказывает.


    1. franzose
      27.03.2019 00:34

      Аннотации — в сложных случаях вырождаются в программирование на комментариях.

      А это всё потому, что, в отличие от Java, в PHP аннотации не являются частью языка. К сожалению. В некоторых случаях их удобно использовать «на месте». Например, в контроллерах.


    1. franzose
      27.03.2019 00:37
      +1

      Конфиги, конфиги и ещё раз конфиги. С десяток конфиг файлов в установке с нуля. Куцая документация добавляет боли.

      Ровно то же самое во всех остальных фреймворках. А как иначе вы будете настраивать под свои нужды отдельные компоненты?


    1. TiGR
      28.03.2019 15:17
      +3

      Конфиги, конфиги и ещё раз конфиги. С десяток конфиг файлов в установке с нуля. Куцая документация добавляет боли.
      Установка с нуля — конфигов 8 штук, а по сути 5 (3 ещё — отдельная настройка окружений dev/test). Строк не комментариев, не пустых — 35. Столько же строк — комментариев. Там всё расписано где и что означает.
      Сплошная магия во всех ключевых компонентах (сериализатор, валидаторы, секьюрити) — одна не осторожная строчка в конфиг файлах, или неправильно написанная аннотация, и без пошаговой отладки уже не разобраться.
      Это не магия, это скрытые под капот заморочки. Тут варианта два — либо самому обо всём этом заморачиваться, либо скрыть за слоями абстракций, но в результате, можно в редких случаях получить сложные ситуации.

      Ну и потом. аннотации не обязательны, можно жить без них. С доктриной сложнее, а что в Symfony всё можно сделать и без аннотаций.
      И собственно сами «магические» методы, которые так ругают в других фрэймворках, их здесь кажется даже в разы больше чем в Laravel, только они спрятаны более тщательно.
      Ну вот это вы совсем зря.
      Считаем
      Laravel:
      $ git clone git@github.com:laravel/framework.git laravel && cd laravel
      $ grep -P 'function __(call|get|set|isset|callStatic)\(' src -R | grep -Poi '__[a-z]+' | sort |uniq -c
           41 __call
            6 __callStatic
           14 __get
            8 __isset
            6 __set
      # А если учесть, что там ещё магия часто вынесена в трейты, то надо добавить ещё:
      $ grep -PR 'use .*\\(Macroable|ForwardsCalls|Fluent)' src | grep -Poi '[a-z]+$' | sort |uniq -c
           11 Fluent
           10 ForwardsCalls
           33 Macroable
      

      Symfony:
      $ git clone git@github.com:symfony/symfony.git && cd symfony
      $ grep -P 'function __(call|get|set|isset|callStatic)\(' src -R | grep -v 'Tests' | grep -Poi '__[a-z]+' | sort |uniq -c
            9 __call
            4 __get
            3 __isset
            2 __set
      


      1. trawl
        28.03.2019 17:03
        +2

        аннотации не обязательны, можно жить без них. С доктриной сложнее, а что в Symfony всё можно сделать и без аннотаций.

        А в чём сложности с Доктриной?


        Там же тоже можно без аннотаций docs


  1. kpbsod
    26.03.2019 16:11

    PHP не очень люблю, но приходится c ним работать. Так же приходится работать с Kotlin.
    Сравнивая два этих языка могу сказать, что в мире PHP ещё очень многое предстоит сделать.
    Мне вот, например, очень сильно не хватает:

    • дженериков (раз уж язык начал стремиться в статическую типизацию);
    • нормальных коллекций и мэпов;
    • адекватного синтаксиса для лямбд;
    • нормальных аннотаций (а не вот эти вот дурацкие комментарии);
    • поддержка UTF-8 по дефолту для всех функций;
    • производительность хромает, нужна производительность получше;
    • composer ужасен, в сравнение с Gradle, по крайней мере.


    Ну и всякого другого по мелочи.

    В Symfony не нравится зашкаливающее количество всяких конфигураций и неочевидных моментов. В это плане Spring Framework (особенно в связке со Spring Boot) намного проще.


    1. AlexLeonov
      26.03.2019 19:25

      В PHP нет никакой статической типизации и никогда не будет. Откуда?

      Статическая типизация — определение и контроль типа значения и/или переменной при компиляции.

      В PHP контроль типов принципиально рантаймовый. И никогда иным не был.

      Откуда хоть вы этот миф берете, про «движение к статической типизации»?


      1. kpbsod
        26.03.2019 20:22

        Например, как вы в рантайме вернёте не string из функции ниже? Ни это ли элементы статической типизации?

        class A {
            function f(): string {
                return new A();
            }
        }
        
        echo (new A())->f();
        


        1. HEKET313
          26.03.2019 20:53

          И, кстати, скоро в свойства классов типы тоже завезут


          1. EvgeniiR
            26.03.2019 22:30
            +2

            Да, только type hints != статическая типизация.


        1. EvgeniiR
          26.03.2019 22:23
          +4

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


          1. sumanai
            26.03.2019 22:37

            Точнее по умолчанию PHP молча приведёт тип к требуемому.


            1. EvgeniiR
              26.03.2019 22:40
              +2

              Это уже следствия слабой(нестрогой) типизации, и не все типы конвертируются.


              1. Soo
                27.03.2019 06:55

                Я вот этого не понимаю. Когда работают на С и иже с ними все страдают со строгой типизацией и пытаются постоянно менять типы. Когда переходят на языки с нестрогой типизацией — РНР или JS, начинают хаять эту нестрогую типизацию и сочиняют всякие TypeScript и подобное.
                Не знаю, мне строгость типизации проблем не доставляла, может я уже привык просто ко всяким примочкам приведения типов, что я уже и не замечаю каких-либо неудобств


                1. EvgeniiR
                  27.03.2019 13:15

                  Нестрогая типизация повышает риск возникновения багов, которые на так уж и просто отловить

                  может я уже привык просто ко всяким примочкам

                  Хорошо если привыкли, но если пробежаться по типичным проектам можно увидеть как люди символьную строку с int сравнивают через нестрогое сравнение


                  1. SirEdvin
                    27.03.2019 18:02

                    del


                  1. 0x131315
                    28.03.2019 11:17

                    Нестрогая типизация в интерпретируемых языках более удобна, ИМХО.
                    Позволяет срезать углы.

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

                    Огромный минус — вот эти вот танцы вокруг типов и, как следствие, необходимость плодить и поддерживать много почти одинакового кода, следить за его синхронизацией, вносить правки в каждую копию кода (забудешь же, т.к. в каждой логика немного отличается), и тестировать отдельно каждую копию — хороший источник человеческих ошибок, невнимательности.

                    На интерпретируемом языке с динамической типизацией проще.
                    Если видишь, что код простой — объявляешь возвращаемый тип, и ошибку получаешь только если в код передали вообще какую-то дичь, и так и так надо падать и разбираться что это было.
                    А если видишь, что ситуаций может быть много и возвращаемых типов несколько — не объявляешь возвращаемый тип, но добавляешь комментарии и, ориентируясь по ним, в методы, которые используют результат работы кода, добавляешь соответствующие проверки типов, если нужно, или описывашь логику так, чтобы она работала сразу со всеми типами, что часто раздувает код всего на пару строк.
                    Нет дублирования кода под разные типы — правки почти всегда согласованы, и делаются в одном-двух местах, а не в десятке.

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

                    Как минус: без теста трудно сказать, будет ли код работать. Но для этого есть юнит-тесты.
                    Как плюс: работающий код можно писать сразу.
                    Написал — посмотрел какие косяки — поправил, посмотрел — поправил.
                    Очень быстро все критичные ошибки выловил — код работает, ушел в продакшн. Потом по репортам фиксишь мелкие косяки.
                    Более быстрая и интерактивная разработка получается: код адаптируется под задачу и вместе с задачей.


                    1. andreymal
                      28.03.2019 11:37
                      +1

                      для каждой из них написать копию метода со своими типами

                      много почти одинакового кода

                      Дженерики, интерфейсы и трейты — не, не слышали?


                      1. SerafimArts
                        28.03.2019 14:37

                        Дженерики, интерфейсы и трейты — не, не слышали?

                        Ну, допустим, в Go не слышали :D


                        1. andreymal
                          28.03.2019 14:41

                          Ага, я подумывал ответить что-то в стиле «Ловите гошника!», но решил воздержаться)


                          Но в Go 2 вроде обещали какие-то дженерики (но это не точно)


                1. VolCh
                  27.03.2019 13:20
                  +1

                  С — язык со слабой типизацией :)


                1. impwx
                  27.03.2019 13:30

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


          1. syfim
            27.03.2019 12:40

            Ошибка, конечно, случится в рантайме. Но вот шанс её возникновения будет куда ниже — ide подсветит ошибки по невнимательности


        1. Jouretz
          26.03.2019 22:56

          Хм…

          <?php
          declare(strict_types = 1);
          
          class A {
              function f(): string {
                  return new A();
              }
              
              function __toString() {
                  return "5";
              }
          }
          
          echo (new A())->f();
          

          Fatal error: Uncaught TypeError: Return value of A::f() must be of the type string, object returned in /in/OWFlL:6

          ok, пусть это была опечатка
          <?php
          declare(strict_types = 1);
          
          class A {
              function f(): string {
                  return (string) (new A());
              }
              
              function __toString() {
                  return "5";
              }
          }
          
          echo (new A())->f();
          echo "\n\r";
          echo ((new A())->f()) + "2";


          Output for 7.3.3 | took 12 ms, 14.52 MiB
          5

          7

          3v4l.org/2KdVU

          Тайпхинтингу до статической типизации ещё жить и жить.


          1. EvgeniiR
            26.03.2019 23:01
            +1

            Тайпхинтингу до статической типизации ещё жить и жить.

            Как ваши примеры связаны со статической типизацией?
            Автокаст типов — последствия слабой(нестрогой типизации). А типы возвращаются верные(функция возвращает строку), только опять же это не статическая типизация, т.к. типы проверяются в рантайме


            1. Jouretz
              26.03.2019 23:06
              -1

              Дык никак =_=
              В комментарии выше говорится что тайпхинт — элемент статической типизации.
              По факту он никак не мешает переменным менять тип в процессе исполнения и, как я понимаю, выполняет только функцию создания видимости порядка в хаосе автоприведения типов.


          1. KBagpaT
            27.03.2019 17:31

            Тут есть момент,

            echo ("5") + "2"
            тоже выведет 7


        1. AlexLeonov
          27.03.2019 13:58

          Нет, это не статическая типизация, это динамический контроль типов. Вы слегка путаетесь в терминах.


        1. xotey83
          28.03.2019 15:08
          +1

          Это не элементы статической типизации. Статическая типизиция подрузамевает, что все типы всех переменных известны по время компиляции в поэтому в рантайме проверять типы нет необходимости.

          В PHP это используется динамический контроль типов, да то они проверяются лишь во время вызова функции и возврата значения. Пример ниже нормально работает для PHP, но при этом он был бы недопустим для языка со статической типизацией:

          function foo(int $bar)
          {
              $bar = 'baz'; // упс! взяли аргумент, который объявлен как int, и положили в него строку
          }


    1. Gemorroj
      26.03.2019 20:58
      +14

      composer ужасен

      вот это заявление) вроде как наоборот, считается великолепным пакетным менеджером. что не устроило в композере?


      1. Tatikoma
        27.03.2019 12:38

        Если придираться, то он довольно медлителен. А вообще да, с появлением composer жизнь стала сильно лучше.


        1. symbix
          27.03.2019 15:59

          он довольно медлителен

          Медленный там только composer update (потому что реализован по уму и там внутри настоящий SAT Solver), но update нужен раз в полгода. Все остальное весьма шустро.


          1. Tatikoma
            28.03.2019 12:22

            Вы не работали с yii2, когда он требовал bower-asset… Как я понимаю там получался приличный список пакетов/зависимостей, обработка которого и сжирала тонну времени.


    1. molchanoviv
      26.03.2019 21:10
      +2

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


    1. franzose
      27.03.2019 00:42

      composer ужасен, в сравнение с Gradle, по крайней мере.

      А в чём их кардинальная разница? Я совсем немного знаком с Gradle, поэтому интересно.


      1. franzose
        27.03.2019 00:44

        Выше уже ответили)


    1. msatersam11
      27.03.2019 09:39

      И… что в итоге должно получиться?

      Очередная джава, плюсЫ или шарп? -Постой-ка, так они уже есть…


  1. zim32
    26.03.2019 16:19
    +1

    Пхп красава, он как гадкий утенок. Пока его все поливали бурой массой, он взял и вырос в красавца.


  1. BruAPAHE
    26.03.2019 16:54

    Шел 2019 год. Люди начали понимать, почему все пишут на пыхе


    1. YemSalat
      27.03.2019 08:56

      > все пишут на пыхе
      Смелое заявление :)


      1. Djeux
        27.03.2019 11:17

        Если брать область веба, то 80%. Довольно значительная часть.


        1. YemSalat
          27.03.2019 12:19

          Откуда статистика?


          1. Djeux
            27.03.2019 12:20

            1. YemSalat
              27.03.2019 13:53

              Вот вам цитата:

              According to W3Techs’ data, PHP is used by 78.9% of all websites with a known server-side programming languagе

              Т.е. это данные по «веб-сайтам» которые сканирует W3Tech. В таком же стиле можно утверждать что 99.9% сайтов используют javascript, поэтому он перспективнее.
              В общем с реальным положением дел имеет мало общего.
              Для более наглядной картины («все пишут на пыхе») лучше посмотреть рынок вакансий (нормальных вакансий) в сфере веб-раразботки, там пхп далеко не 80%


              1. sumanai
                27.03.2019 20:43

                В таком же стиле можно утверждать что 99.9% сайтов используют javascript, поэтому он перспективнее.

                JS замены нет, нет конкуренции языков, отсюда и результат. У PHP море конкурентов.


                1. YemSalat
                  29.03.2019 03:37

                  Мой комментарий не про это был, а про то что статистика не убедительная.


        1. IvanNochnoy
          27.03.2019 15:04

          Если брать область Веба, то из этих 80% сайтов на Пыхе, 90% — это бложики на Wordpress с посещяемостью 1 человек в месяц, т. е. фактически одна программа, растиражированная миллионными экземплярами. Судя по той же статистике, Java вообще в заднице со своими 2-3%, одако эти 2-3%, собирают у себя больше посещений, чем все сайты на Пыхе вместе взятые. Сто раз уже говорил, что смотреть нужно не по количеству сайтов, а по количеству рабочих мест.


          1. sumanai
            27.03.2019 20:45
            +1

            одако эти 2-3%, собирают у себя больше посещений, чем все сайты на Пыхе вместе взятые

            VK и Facebook так или иначе используют PHP, не зря же оба пишут свои инструменты для него. А как там у них с посещаемостью? А то я соцсетями не пользуюсь.


          1. samizdam
            27.03.2019 23:59

            Вот не надо. Не бложиками едиными.

            Из мирового топ-20 алексы навскидку Wikipedia, FB, VK достоверно используют php как основной язык.
            Badoo, кстати, к поднятому выше вопросу о нормальных вакансиях: tech.badoo.com/ru/vacancies
            Запилить малый/средний/крупный интернет-магазин на чём-то кроме php, с точки зрения бизнеса выглядит той ещё авантюрой.
            Ну и конечно, наш всеми любимый уютный Хабр)

            Так что с трафиком все нормально.

            По количеству рабочих мест, можете посмотреть сами тоже всё в порядке.
            Можно убедиться в этом посмотрев кол-во вакансий на любом ресурсе. Не забывайте, что в языках где рабочих мест будто бы больше (java например), не только веб, и сменить специализацию порой сложнее чем язык. А php — исключительно веб.


  1. paco
    26.03.2019 16:59

    Шел 2019 год, а сообщество PHP до сих пор не обновили PHP.net и не написал нормальную документацию.


    1. arkamax
      26.03.2019 17:51

      Пару лет назад на ZendCon Сара Големон не особо скрывала, что в документации дыры и волонтеры для их починки *очень* приветствуются. По-простому говоря, если есть руки и знание языка — ради бога приходите. Возможно все же есть какой-то сравнительно жесткий входной ценз для волонтеров.


    1. michael_vostrikov
      27.03.2019 12:00

      Меня больше удивило, что обсуждение разработки ведется через рассылку по email всем кому надо и не надо. И отдельно существует веб-интерфейс к этим письмам. Самый популярный язык для веб-разработки, можно же было какой-нибудь форум сделать с подпиской на конкретные темы.


      1. samizdam
        28.03.2019 00:02

        Я просто оставлю это здесь: habr.com/ru/post/314084


        1. michael_vostrikov
          28.03.2019 00:28

          Ну я бы наверно согласился, что для Linux это в некоторой степени оправдано, но блин для языка веб-разработки?)


  1. s0lar
    26.03.2019 17:12

    Обожаю Симфони 4.
    Но если ты попадаешь на стэковерфлоу с вопросом о связи двух и более Entity, то разбор превращается в ад.
    В итоге ты скролишь огромные простыни с описанием сущностей.


    1. GreyStrannik
      26.03.2019 22:24
      +3

      В документации Doctrine есть хорошие примеры и сложные случаи, обычно их хватает. Не хватает — можно и на StackOverflow.


  1. arkamax
    26.03.2019 17:59
    +14

    У меня есть полдесятка знакомых сеньоров с 5+ годами опыта в своей области (не-PHP), которые немного не в курсе выхода версии 7.0 (некоторые про 5.0 не слышали). Когда говорю, что у меня 90% работы на РНР — сочувствующая усмешка. Потом они слышат о наличии вещей типа интерфейсов, жесткой типизации и встроенной крипты, и отвисшие челюсти можно снимать на видео. Контрольный в голову — «а еще на РНР было рассчитано 40+ тысяч операций на глазах, и ни один не пострадал» (было у меня как-то несколько проектов по медицине). Удивляет, что современные профессионалы продолжают высказывать безапелляционное мнение при отсутствии адекватной информации о сути дела.


    1. GrigoryPerepechko
      27.03.2019 05:26
      +1

      Встроенная крипта — это вы про вызовы сишных либ?
      Жесткая типизация — это про тайп хинты?
      Интерфейсы — это те которые определяют только имя метода и кол-во аргументов, но не их типы?
      Про расчет — позабавили. Я погуглил про 64 битные числа, и оказывается что на PHP 5 на винде они вообще недоступны, а на линуксе необходима 64битная машина (!). Потом я прочел совет использовать BCMath, и увидел в сигнатурах функции сложения чисел в аргументах строки, Карл! Еще в 7 классе многие писали длинную арифметику на паскале на массивах (байтов, либо кто покруче интов). А тут строки.

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

      Как способ быстро добиться результата (http ответа с html, либо с json на базе ответа из БД), наверное PHP удобен, но не потому что язык хорош, а потому что одну и ту же задачу на нем решали миллионы раз и написали понятных оберток. Как язык (да, тут подразумевается язык общего назначения) — это мусор какой-то и писать на нем расчет медицины (что бы это не значило) не стоит.


      1. Compolomus
        27.03.2019 10:00
        +1

        Интерфейсы с типами же. Типы аргументов и тип возвращаемого значения, просто не все делают строгие интерфейсы


      1. arkamax
        27.03.2019 18:57
        +3

        Ну вот опять.

        Встроенная крипта — это вы про вызовы сишных либ?

        Большая часть функциональности программ в user mode — это вызовы либ (начиная от glibc на GNU), это если вы конечно не хотите изобретать велосипеды. Я не столько про это, сколько про sodium в PHP 7.2. В отличие от упомянутого ниже (и удаленного из 7.2) mcrypt:

        1. Sodium куда проще правильно готовить. Он не позволяет использовать многие нестойкие / ослабленные режимы типа AES-ECB — от чего страдал mcrypt. Огромная часть атак на методы шифрования выполняется на некорректное их использование, а не на основополагающие алгоритмы. При этом большая часть разработчиков не заморачивается деталями, и использует первый же метод из документации. При этом если голова на месте — пожалуйста, используй openssl и шифруй так, как заблагорассудится. По факту имеем систему, более подходящую для разработчиков, не имеющих базовых знаний по криптографии.

        2. Sodium влит в ядро. Я только что проверил — на том же EasyApache нет опции, чтобы его отключить (на mcrypt — есть), на основной платформе (Linux) он отключается только опцией компиляции (а не строчкой в конфиге). Это дает основания ожидать, что он будет доступен на подавляющем большинстве хостингов, в отличие от mcrypt — что заставляло городить тот же AES/Rijndael в нативном режиме.

        Жесткая типизация — это про тайп хинты?

        Намек: hint на английском — намек. На данный момент это уже не намек, а декларация: «Type declarations were also known as type hints in PHP 5.» — это что касается аргументов функций / методов. Декларативное объявление типа аргумента выбросит исключение при вызове с несовместимым аргументом. Несколько моментов:

        1. Формально это не жесткая типизация на уровне хранения данных. Во многих других ЯП это куда строже — однако здесь на уровне исходного кода получается то же самое как минимум в контексте вызова методов / функций.

        2. Типы переменных пока декларировать нельзя, декларацию типов свойства объектов добавят в PHP 7.4. При этом никто не мешает повесить getters/setters на свойства и типизировать их аргументы.

        Интерфейсы — это те которые определяют только имя метода и кол-во аргументов, но не их типы?

        Уже давно определяют (при желании). Несовпадение по типам в реализующем классе дает исключение.

        Я погуглил про 64 битные числа, и оказывается что на PHP 5 на винде они вообще недоступны

        Простите, и что? При разработке приложений обычно ориентируются на наиболее массовые системы. 1. PHP на Windows — точно не самая массовая система. 2. Поддержка PHP 5 даже на уровне обновлений безопасности прекращена в прошлом году.

        а на линуксе необходима 64битная машина (!)

        1. Насколько вы знакомы с современным рынком хостинга? Тот же RHEL/CentOS с версии 7 поддерживает только 64-битную архитектуру как минимум на Интелах, процессора имеют 64-битные расширения уже много лет.

        2. Почему обязательно использовать 64-битные числа — на всякий случай?

        Потом я прочел совет использовать BCMath, и увидел в сигнатурах функции сложения чисел в аргументах строки, Карл!

        Это декларация аргумента — просто чтобы загнать в движок число произвольной длины (arbitrary precision). Да, вы можете запихать туда нечисленное значение — не надо этого делать. Альтернатива — использовать указатели на блок памяти (небезопасно, их в PHP просто нет в обычном понимании), или другие методы работы с памятью. Строки в PHP при этом вполне работоспособны для переноса числовых данных, и не только их.

        Как язык (да, тут подразумевается язык общего назначения) — это мусор какой-то и писать на нем расчет медицины (что бы это не значило) не стоит.

        Ваше мнение мне понятно, и я его уважаю. Позволю себе изложить некоторые факты:

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

        1. «Расчет медицины» бывает разный. В моем случае (расчет интраокулярных операций) стандартной точности PHP (сейчас не помню дефолты в 5-й версии, ЕМНИП 12 или 14 знаков после запятой, в 7.3 — 14) было более чем достаточно. BCMATH приходилось использовать лишь в единичных случаях — в остальных с лихвой хватало обычных float.

        2. После любых изменений подобного кода в обязательном порядке прогоняются регрессионные тесты. В моем случае они выполнялись на нескольких десятках (сотнях) тысяч расчетных кейсов, описывающих оптико-биологические параметры человеческого глаза. Результаты должны совпадать с контрольными расчетами (мы использовали MatLab) до офтальмологической клинической значимости (плюс-минус 1/10 диоптрии). За всю свою практику расхождений по регрессионным тестам больше чем в 6 знаке после запятой я не видел — и это были пограничные кейсы. Это разница с клинической значимостью на 5 порядков… Карл. Позволю себе утверждать, что конкретные требования были более чем закрыты.

        3. Как-то мне пришла в голову мысль, что гонять регрессии на таблице кейсов неспортивно, и я запустил расчеты по всему диапазону параметров (глубина передней камеры от 0 и выше, в числе других извращений). Некоторые результаты оказались «нестандартными». Когда мой шеф (хирург-офтальмолог-математик) увидел эти расчеты, он сказал, что использованные параметры не описывают систему зрения биологически возможного человека (ну не бывает у людей глаз 5 сантиметров в диаметре).

        4. Мы рассматривали вариант гонять вычисления напрямую на движке MatLab — но не потому, что не устраивала точность PHP, а чтобы сократить время на конверсию методик. Этот подход было признан неэффективным как с инженерной точки зрения, так и с точки зрения поддержки и развития системы.

        5. Некоторые конкурирующие системы расчетов были написаны… на Excel. При этом их точность страдала не от точности управления данными итп, а от кривых/упрощенных методик.

        6. Для полной ясности: десятки тысяч реальных операций было посчитано и выполнено. У меня лежат письма от хирургов, у которых люди плакали от счастья, в первый раз за 10 лет увидев мир без очков толщиной с бутылочное донышко. У меня язык не повернется сказать, что это было сделано «не по фэншую». Негативных последствий, вызванных расчетными методиками, замечено не было, подавляющее большинство введенных изменений относилось к обновленным клиническим рекомендациям от производителей аппаратуры.

        Вывод — был выбран инструмент для решения задачи, выбор был обоснован и подтвержден многочисленными проверками, и адекватность выбора была подтверждена массой реальных кейсов. ИМХО ваша фраза про «не стоит» — это широкое утверждение, под которым я не вижу точного обоснования, подтвержденного детальными расхождениями с требованиями конкретных задач. Как результат, ваш комментарий лишь подчеркивает мой тезис о том, что прежде чем называть язык мусором, неплохо бы собрать информацию о четко описанных косяках из реальной жизни, которые вы собираетесь критиковать.


    1. YemSalat
      27.03.2019 08:46

      > встроенной крипты
      В пхп7 есть «встроенная крипта»? Что?


      1. Sau
        27.03.2019 11:31
        +1

        PHPCoin, очевидно же. Часть пакета php7-blockchain


        1. YemSalat
          27.03.2019 12:18

          ключевое слово «встроенной»
          Сорри, я не особо в курсе текущего состояния экосистемы пхп, но неужели там пакеты для блокчейна теперь тоже «нативно», как mysqli_* или типа того?


          1. vdem
            27.03.2019 12:25

            Я так понял, что это шутка юмора была :D А под «встроенной криптой» имелись в виду функции шифрования.


            1. isden
              27.03.2019 14:37

              Ну не то чтобы совсем "встроенной"…
              Нужны ключики соотв --with-openssl / --with-sodium. Т.е. это дополнительные фичи языка, а не нечто встроенное.


              1. VolCh
                27.03.2019 14:51

                Это встроенные опциональные модули. :)


                1. YemSalat
                  27.03.2019 14:53

                  Дай им бог здоровья, но звучит все-таки не так <круто>, как «встроенная крипта»


                  1. isden
                    27.03.2019 14:59

                    > Дай им бог здоровья

                    И тут я второй раз в этом треде вспомнил про mcrypt.


      1. VolCh
        27.03.2019 13:25

        Стандартные расширения для работы с криптографией


        1. YemSalat
          27.03.2019 13:48

          Ну если это называть «встроенной криптой» — то даже не знаю :)
          И не получится ли с этой «встроенной» темой как получилось с `mysql_*` через n лет?


          1. vlreshet
            27.03.2019 14:12

            И не получится ли с этой «встроенной» темой как получилось с `mysql_*` через n лет?
            Так а что с mysql_ не так, поддержка MySQL не исчезла же совсем, она просто переродилась в более совершенные mysqli и pdo. Чем плохо?


            1. YemSalat
              27.03.2019 14:19

              Ну я к тому что вы уверены что на новичков, использующих текущую реализацию, потом не будут кричать «эй, ты что дурак?! зачем юзаешь crypta_, надо же юзать cryptai_ или PDО!!»


              1. vlreshet
                27.03.2019 14:51

                Ну будут кричать, и что? Суть то останется то же самой — у PHP будет встроенное расширение от криптографии. То о чём вы беспокоитесь — это уже проблемы обратной совместимости, это немного другая песня


                1. YemSalat
                  27.03.2019 17:42

                  Ну у пхп есть встроенное решение — mysql_
                  И ведь кричат.
                  И что? На ровном месте поди.


                  1. VolCh
                    27.03.2019 19:45

                  1. sumanai
                    27.03.2019 20:55
                    +1

                    Оно было объявлено устаревшие и выпилено спустя много лет после этого объявления. mysqli и pdo полностью перекрывают его возможности. Что не так?


              1. VolCh
                27.03.2019 14:51

                Как бы уже кричат :)


                1. YemSalat
                  28.03.2019 17:15

                  Меня уже заминусили, но моя основная мысль была в том что, возможно, не стоит все встраивать в сам язык, чтобы потом нe было проблем в стиле «да, это встроено, но не вздумай использовать!!!»
                  Т.е. «встроенная крипта» — это минус, а не плюс.


          1. isden
            27.03.2019 14:56

            > И не получится ли с этой «встроенной» темой как получилось с `mysql_*` через n лет?

            Это уже было.


      1. arkamax
        27.03.2019 18:58

        См. мой комментарий выше.


  1. berezuev
    26.03.2019 18:06
    +18

    Всем тем, кто ругает рнр и Симфу за аннотации, конфиги и магию:
    Перестаньте уже использовать Sublime Text и Notepad++ для редактирования PHP. Поставьте PHPStorm и к нему 3 плагина: PHP Annotations, Symfony plugin и EA Inspections, и пользуйтесь всеми благами IDE (инструменты рефакторинга, навигации по коду, встроенные инспекции и т.д.).

    И да пребудет с вами «shift shift».


    1. sumanai
      26.03.2019 21:57
      -6

      Поставьте PHPStorm

      Его купить для начала надо. И он считается не самым быстрым инструментом.


      1. iproger
        26.03.2019 23:07
        +3

        Около 80 в год, да. И комп нужен с i7/r7 чтобы нормально было. Зато очень удобно.


        1. sl0
          27.03.2019 02:51

          Работаю на i3 — полет нормальный. Обычно тормоза происходят из-за каких-нибудь кривых плагинов.


        1. trawl
          27.03.2019 06:58

          Celeron G3930. Полёт нормальный.


          1. iproger
            27.03.2019 07:48

            Видимо надо менять, мне бракованный попался. Проект в реиндексе загружает 9900k на 100% в течении 15 секунд.


            1. trawl
              27.03.2019 07:54

              Возможно, SSD поможет (или уже)?
              У меня SSD и 8Гб оперативы, шторм установлен нативно (не через snap) на linux mint 19.1.
              За загрузкой процессора, конечно не наблюдал, но не припомню, чтобы были безбожные тормоза


              1. iproger
                27.03.2019 08:14

                У меня не совсем обычный случай. На компах стоят ssd, но проект находится на соседнем через гигабитный lan. Phpstorm ругается что соединение медленное, хотя терпимо, на уровне hdd.


                1. tendium
                  27.03.2019 08:15

                  Почему проект не может быть на вашем компе в локальном каталоге?


                  1. iproger
                    27.03.2019 19:36

                    Потому что лучше пожертвовать скоростью в phpstorm чем чтобы проект работал медленно из-за сетевых задержек.


                    1. VolCh
                      27.03.2019 19:51

                      Не знаю как остальные более-менее популярные IDE, но PhpStorm и ко явно предупреждают, что лучше использовать синхронизацию чем монтирование


                    1. michael_vostrikov
                      27.03.2019 20:18

                      Обычно делают deployment через sftp при сохранении файла.


                      1. iproger
                        27.03.2019 21:14

                        У меня локальный проект. На сервере Ubuntu с samba, на пк винда.


                        1. michael_vostrikov
                          27.03.2019 21:49
                          +1

                          Вы клонируете репозиторий на свой компьютер, в локальную ФС. Настраиваете в PHPStorm секцию deployment, я вот там сейчас вижу в числе прочих варианты "SFTP" и "local or mounted folder". При сохранении он загружает файл на удаленный сервер. Вы получаете плюшки локальной работы с файлами и удаленных сервисов типа компиляции или веб-интерфейса. Обычно параллельно открыто соединение к серверу по ssh. Можно коммитить с локальной машины. Если репозиторий через интернет недоступен, делаете проброс портов через putty или ssh в git bash, соответственно меняете настройки системы контроля версий.


                          1. iproger
                            27.03.2019 22:29

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


                            1. VolCh
                              27.03.2019 22:31

                              realsync смотрели?


                              1. Source
                                28.03.2019 00:39

                                А Вы ещё удивлялись откуда хейт берётся… Люди всерьёз обсуждают, как из IDE редактировать файлы напрямую на боевом сервере :facepalm:


                                1. michael_vostrikov
                                  28.03.2019 00:45

                                  Какой боевой сервер, вы о чем?


                                  1. Source
                                    28.03.2019 23:10

                                    О сервере, который обслуживает пользователей проекта. О чём же ещё...


                                    1. michael_vostrikov
                                      29.03.2019 07:18

                                      Ну а люди всерьёз обсуждали сервер для разработки, а не тот, который пользователей обслуживает.


                                      1. Source
                                        29.03.2019 10:24

                                        Каждому программисту отдельный сервер для разработки? Или вы только случаи команды из одного человека рассматриваете?


                                        1. michael_vostrikov
                                          29.03.2019 10:49

                                          Зачем отдельный-то? Я же ниже написал — создается папка, настраивается домен. Разработчик редактирует код на одной машине, а работает он на другой. В чем вообще необходимость локально его запускать?


                            1. michael_vostrikov
                              28.03.2019 00:06

                              Так если ssh открыт, какая разница? На сервере работаете через консоль, логи проверяете стандартными командами сервера (grep, tail). Разница только в расположении исходников. Если надо что-то просмотреть локальными инструментами (ну да, mcedit не всегда хватает), можно тоже скачать на локальную машину.


                      1. kivsiak
                        28.03.2019 00:17
                        -4

                        Вот почему пхпшники удивляются почему их за программистов не считают. Вот поэтому:

                        Вместо цикла
                        — пуш в репо
                        — прогон тестов
                        — сборка пакетов или образа
                        — деплой пакета или образ

                        вы до сих пор напрямую или опосредованно правите фаилы на сервере и не понимаете в чем ваша проблема

                        Что обидно есть и грамотные инженеры что практикуют правильные подходы. Но мнение о пхп культуре разработки и языке в целом составляют не по ним.


                        1. michael_vostrikov
                          28.03.2019 00:29
                          +1

                          Это вы не понимаете, что такой проблемы нет. Прочитайте всю ветку пожалуйста.


                          1. kivsiak
                            28.03.2019 00:37

                            >Обычно делают deployment через sftp при сохранении файла.

                            Я читаю вот это и меня бомбит.


                            1. michael_vostrikov
                              28.03.2019 00:38

                              Я и говорю, прочитайте всю ветку. Хотя бы комментарий, на который я отвечал.


                              1. kivsiak
                                28.03.2019 00:56
                                -1

                                >Обычно делают deployment через sftp при сохранении файла.

                                это тот полностью коммент на который я ответил.

                                Я перечитал внимательнее ветку. Меня еще больше момбануло. 2018 год править исходники в стевой шаре!

                                Автор из кожи вон лезет показывая что пхп наконец то стал адекватным языком, приводит правильные аргументы, и тут читать вот это!


                                1. vdem
                                  28.03.2019 01:06
                                  +1

                                  А причем тут конкретно PHP? Можно и на Java так делать :)


                                  1. kivsiak
                                    28.03.2019 01:18
                                    -1

                                    Притом что на хабре я ни разу не видел предложения копировать .java на сервер.


                                1. michael_vostrikov
                                  28.03.2019 01:08

                                  Блин. Есть настроенный для разработки сервер, с нужными ресурсами для запуска приложения и DNS именами. Есть машина разработчика, к которой вообще никаких требований нет, ни по ресурсам, ни по сетевой конфигурации. Разработчик может редактировать файлы на настроенном сервере через консольные редакторы, может монтировать удаленную ФС на локальную машину со всеми недостатками по скорости, а может загружать на этот сервер файлы при сохранении, при этом сохранять возможность работать с проектом локально, в том числе с системой контроля версий. Вы какой вариант выбираете и почему?


                                  1. kivsiak
                                    28.03.2019 01:35

                                    Круто. Реально круто что вы такое настроили. Лет так 15 назазад работал я в такой конторе. Не удивлюсь что до сих пор работает. Тогда это правда от бедности практиковали. Да и сейчас это все локально 1 скрипт запустить…

                                    Вот только вопрос вы задали странно. Между чем я должен выбирать, уточните плз. Заодно прикиньте это точно к контнексту не ветки но хотя бы последних 5 постов относится?


                                    1. michael_vostrikov
                                      28.03.2019 01:43

                                      Это стандартный вариант, когда на личной машине разработчика меньше ресурсов (или настроек сети), чем нужно для приложения. Какой такой скрипт вы имеете в виду, который добавляет ресурсов машине? Варианты, между которыми выбирать, я уже написал. Еще раз, к деплою на боевой сервер это никак не относится.


                                      1. kivsiak
                                        28.03.2019 02:39

                                        Если мне надо развернуть локальное окружение я использую докер — стандарт де факто в 2019 году.

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

                                        Но я кажется четко и однозначно процитировал коммент на который я отвчеал. Речь шла о деплойментеГ.


                                        1. michael_vostrikov
                                          28.03.2019 08:22

                                          я тот тоже докер разверну удаленно на инстансе что мне эти ресурсы обеспечит

                                          Ну можно и так, а как вы там код редактировать будете? commit+push+pull на каждое изменение?


                                          Речь шла о настройке, которая конкретно в PHPStorm называется "Deployment".


                                      1. Source
                                        28.03.2019 23:28

                                        Приведите конкретный пример, для чего на машине разработчика может не хватить ресурсов? Как правило, она вполне сопоставима с инстансом сервера по мощности. Я могу представить несколько случаев, когда понадобится dev-сервер именно с целью разработки, но это такие редкости, с которыми 99.9% программистов ни разу не пересекались.
                                        И, кстати, сколько у вас таких dev-серверов? По одному на каждого программиста? Или все параллельно правят исходники напрямую на сервере мимо коммитов и молятся, чтобы их правки не переклись? xD


                                        1. michael_vostrikov
                                          29.03.2019 08:24

                                          "2019 год", а люди не знают, что такое площадка для разработки на серверах компании) Я с этим сталкивался как минимум в 3 компаниях, где работал. Так что 99% не соответствует действительности. Обычно делают отдельную папку для разработчика, на нее настраивают поддомен. Коммиты делаются как обычно.


                                          У нас например приложение связано с индексацией больших массивов данных. На сервере для разработки 16 ядер и несколько десятков гигабайт оперативной памяти. Есть несколько сервисов на отдельных хостах во внутренней сети, в коде используются специфичные для Linux вещи. Часть кода на Java, при этом мне не надо держать на своей машине компилятор. Но дело же не только в мощностях. Сервер организации контролируют админы организации — установка пакетов, мониторинг, права доступа, безопасность. Да, есть докер, но приложение делалось задолго до него. Сейчас мы как раз на него переходим.


                                          1. Source
                                            29.03.2019 10:36

                                            У нас например приложение связано с индексацией больших массивов данных.

                                            Ну, ok. И вы на каждый чих запускаете такую индексацию, осознанно замедляя себе цикл обратной связи в сотни раз? Новые фичи прекрасно можно делать с малым массивом данных, а потом проверять на тестовом сервере, куда идёт обычный деплой, и никаких правок руками на сервере.


                                            Я с этим сталкивался как минимум в 3 компаниях, где работал. Так что 99% не соответствует действительности.

                                            То, что кто-то так делает, вовсе не гарантирует, что имеется хоть какая-то необходимость так делать.


                                            Да, есть докер, но приложение делалось задолго до него.

                                            Ну вот по организации работы с кодом оно и осталось где-то на уровне 2007 года, чем и вызывает удивление. Не то, что бы это прям ужасно, но всерьёз обсуждать уже смысла нет. Просто устаревшие практики ещё не отовсюду выпилили.


                                            1. michael_vostrikov
                                              29.03.2019 11:16

                                              И вы на каждый чих запускаете такую индексацию, осознанно замедляя себе цикл обратной связи в сотни раз?

                                              О каком замедлении и какой обратной связи вы говорите? Я редактирую код в PHPStorm, переключаюсь в браузер либо в консоль с ssh, проверяю работу кода. Всё как обычно, только работает это не на моей машине.


                                              Новые фичи прекрасно можно делать с малым массивом данных

                                              Во-первых, это далеко не все нюансы покрывает, особенно касательно производительности, во-вторых, этот локальный массив данных надо поддерживать. В-третьих, зачем мне это все на локальной машине иметь, включая компиляторы для всех языков, в чем необходимость?


                                              вовсе не гарантирует, что имеется хоть какая-то необходимость так делать.

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


                        1. vdem
                          28.03.2019 00:31
                          +1

                          Сначала коммит, потом пулл, разрешение конфликтов если надо, потом прогон тестов, если проходят — пуш. Или я что-то не так делаю? Какого черта пушить если тесты не прогнаны?
                          P.S. Впрочем если на сервере настроен автоматический запуск тестов то да, норм.


                          1. kivsiak
                            28.03.2019 00:46

                            Вы молодец. Хороший правильный разработчик. Я уверен что у вас привальная машина с полностью настроенным тестовым окружением. Я уверен что вы всегда полностью выполняет весь регламент перед каждым пушем ни разу не пропустив ни одной фазы. Жаль клонировать вас 10 раз современные технологии не позволяют.


                          1. tendium
                            28.03.2019 10:58

                            Ну, если у вас своя feature branch, в которой работаете только вы, то ничего страшного в пуше без прогона тестов нет. Особенно если у вас настроена pipeline на прогон тестов при каждом пуше. У нас я так и сделал, поэтому локально тесты гонять было совсем не обязательно. Единственное, где тесты гонять было крайне желательно, это при мердже feature-ветки в develop и потом при мердже develop в master.

                            P.S. Пуш даже с неработающими тестами в моем случае хорош еще и тем, что мне, как тимлиду важно видеть прогресс юниора и вовремя направить в нужное русло, чем позволить ему потратить несколько дней на неверное решение. Ну и вообще, в конце рабочего дня неплохо бы показать результаты работы, даже если она еще не завершена.


                            1. vdem
                              28.03.2019 11:20

                              До того, как я перешел на фриланс, в конторе где я работал был такой порядок: сначала тесты прогоняются локально, если всё в порядке, изменения отправляются в репозиторий на сервер. На сервере был то ли триггер на пуш в репозиторий, то ли крон-задача, и там тесты прогонялись автоматически. Если какой-то тест фейлился, всем членам команды приходил отчет.


                    1. tendium
                      28.03.2019 10:50

                      Какие сетевые задержки? Вы редактируете в PHPStorm напрямую продакшн?


                      1. VolCh
                        28.03.2019 11:48

                        Сеть сразу подразумевает продакшен? дев-сервера, тест-сервера, стейджы и т. п. не использовали никогда?


                        1. tendium
                          28.03.2019 12:09

                          Использовал. Но никогда не приходило в голову редактировать там файлы напрямую. Всегда использовал push/pull. В одном из проектов при пуше в feature-ветку автоматически создавался dev-проект с кодом из этой ветки.


                          1. VolCh
                            28.03.2019 13:08

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


                            1. Source
                              28.03.2019 23:32

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


        1. krysanoveo
          27.03.2019 07:39

          Нормально будет если замените HDD на SSD


          1. iproger
            27.03.2019 07:54

            Без этого сейчас никуда. Тем более ssd в 2019 уже ставят даже в бюджетные машины.


      1. franzose
        27.03.2019 00:48
        +4

        Вы за работу получаете деньги. И вряд ли какая-то непреодолимая сила мешает вам накопить на лицензию. Продукт у JetBrains действительно шикарный.


        1. JohnDaniels
          27.03.2019 18:11

          Не в тему, но может вы знаете: как в шикарном продукте JetBrains включить отображение папки node_modules? у меня второй день работа тупо стоит. вопрос на тостере


          1. franzose
            28.03.2019 03:54

            Не поверите, но я тоже натыкался на эту проблему. Однажды добавил эту папку в Excluded и она пропала из виду. Починилось это, если не ошибаюсь, только с переходом на следующую мажорную версию. У меня сейчас PHPStorm 2018.3.4.


      1. trawl
        27.03.2019 06:59

        Не так уж и дорого. А ещё EAP есть, если денег мало. Ну или ежемесячный сброс триала, если мало не только денег но и совести


        1. sumanai
          27.03.2019 19:33
          -1

          Использую бесплатный VSCode с открытым исходным кодом, и плагин PHP Intelephense к нему, что делает мою работу не сильно отличающийся от IDE.
          А заминусовали так, как будто я в виндовом блокноте предлагаю править.


    1. KpuTuK
      27.03.2019 07:15

      Есть еще Netbeans IDE
      Можно использовать старую версию 8 с кучей плагинов


  1. OnYourLips
    26.03.2019 20:43

    Если мы отходим от Django в сторону Tornado/aiohtpp/Twisted/Flask итд – то там начинается боль, ибо код в них писать гораздо неприятней, чем в Django.

    Вам нравится Django и Symfony одновременно, но не нравится Flask? Почему?
    Лично из этих трех мне не нравится только Django (из-за его django.db), Flask же значительно ближе к Symfony.


    1. hudson
      26.03.2019 20:52

      Мне кажется даже ближе к Silex или Flex. Обвешиваешь чем нужно, по потребностям, из коробки минимум.


      1. trawl
        27.03.2019 07:07

        Silex — это и естьбыл микро-Symfony. С июня 2018 Silex полностью прекратил развитие.


        1. hudson
          27.03.2019 07:42
          +1

          Ну да, базовый Flex его заменил. Я про общую идеологию, берем минимум, обвешиваем тем что нужно.


          1. s0lar
            27.03.2019 10:29

            Вы немного путаете. Silex — это был микрофреймворк от создателей Симфони.
            А Flex — это плагин, от Симфони, который помогает настраивать приложение на Симфони через composer используя рецепты.
            То есть используюя Flex вы намного проще можете расширять свое Симфони приложение. Вы пишите composer require mailer и composer добавляет новый пакет, а Flex автоматически прописывает его везде где нужно в конфигах Симфони.


          1. VolCh
            27.03.2019 13:29

            Symfony «в минимальной комплектации» заменил Silex. Flex — лишь средство конфигурирования Symfony.


            1. hudson
              27.03.2019 17:31

              Поначалу Фабиен называл его Symfony Flex, вот у меня в голове и осело. Имею в виду минимальный каркас симфони, собраный флексом.


  1. MSC6502
    26.03.2019 21:43

    Если разработку нужно вести по типизированным «паттернам», то тогда вообще зачем нужны разработчики? Нейросеть -> «разработчик №1» и «разработчик №2». и всё.


  1. evgwed
    26.03.2019 22:57

    Побольше бы таких статей, которые посвящают людей, что PHP уже давно не только Personal Home Page. Аж прослезился…

    P.S. Slack думает также (пруф)


  1. BoneFletcher
    26.03.2019 23:05

    У каждого языка есть свои преимущества, на старте проекта нужно очень тщательно взвесить все «за» и «против». Главным преимуществом PHP всегда были скорость и простота разработки, и если раньше, когда каждый писал свой велосипед, вы платились за это качеством кода, то теперь, Symfony/Twig/Doctrine в связке с PhpStorm установили высокий стандарт разработки, что называется, «из коробки». Достаточно набросать базовую структуру проекта, определить стандарты разработки, найти несколько хороших программистов по 100 тыс/мес на удаленке, прособеседовать их по скайпу, организовать рабочий процесс — и через несколько месяцев можно будет сдавать рабочий проект. Это будет намного дешевле и быстрее чем разработка на Java/C#/Python и т.д.

    Главный недостаток PHP — на нем можно сделать не все. Он отлично справляется с тем чтобы принять запрос, обработать его, вернуть ответ и «умереть», но если требуется что-то большее, например, непрерывный обмен данными — сразу начинаются проблемы. В других языках таких проблем нет, в том же nodejs можно сделать все что угодно, за все время работы с ним, мы ни разу не столкнулись с тем чтобы не смогли что-то сделать, в то время как с PHP эта проблема всплывает постоянно и приходится решать ее неприятными «костылями». Но и в nodejs есть свои существенные минусы, так что идеального решения не существует и нужно индивидуально подбирать стек технологий под каждый проект.


    1. porn
      26.03.2019 23:25

      если требуется что-то большее, например, непрерывный обмен данными
      reactphp.org


      1. BoneFletcher
        27.03.2019 01:16

        Только для совсем простых сервисов, большие проекты на нем делать я бы не рекомендовал. По сути это вообще новый язык на основе PHP, там свои пакеты для работы с файловой системой, сетью, базами данных и т.д. Стандартный набор пакетов не очень большой, а сторонние пакеты оставляют желать лучшего. У нас был проект на reactphp/ratchet, работал стабильно, но работать с ним было очень тяжело, поэтому мы его переписали на nodejs/socket.io


        1. TimsTims
          27.03.2019 01:26

          На php и раньше писали демонов, а с версии 7 — утечки памяти почти ушли, не вижу причин, почему демонов писать невозможно.


          1. fukkit
            27.03.2019 10:29

            утечки памяти почти ушли

            Срочно в продакшен!


    1. hatman Автор
      27.03.2019 03:02

      В крупных проектах идет что-то типа:

      symfony -> rabbitMQ -> node.js (go) -> клиент (ДБ)

      т.е. пхп запускает какой-то кусок данных, а все остальное уже идет через очереди, ноду, прослойку итд.


  1. uvelichitel
    26.03.2019 23:14

    я пересел с проектов python/java на проект на php (мне предложили условия от которых было бы глупо отказываться)

    java==кровавый_энтерпрайз с оглушительными salary, в гаражных проектах не применяется. Интересно, какие же нужно было предложить условия чтобы сдернуть с тучных пастбищ.


    1. zim32
      27.03.2019 00:38

      Может ушел в казино онлайн играй без блокировок только у нас! Там зп как в джава энтерпрайзе.


    1. hatman Автор
      27.03.2019 03:24

      1) Рынок ПХП-разработчиков, которые могут в Symfony весьма скромен (отсюда и конкуренция за ручки).
      2) Количество энтерпрайз проектов на Symfony увеличивается с каждым годом (люди переписывают свои легаси проекты на пхп на него)
      3) Так как это уже действующие проекты, то бизнесу проще поднять планку зп и добавить плюшки, нежели сидеть без разработчиков, либо переписывать все на другие платформы с новыми рисками.
      4) Чтобы получать оглушительными salary в Java надо тоже постараться. Там далеко не всем и не везде платят больше 130-140 тысяч. И далеко не всегда эти деньги стоят того, чтобы так работать.


  1. ivorobioff
    26.03.2019 23:33
    -2

    Я писал все время на php + symfony 2/3, затем пересел на java + spring 5+, ни какой такой боли или вообще не удобства не почувствовал, а скорее на оборот, радость и ощущение свободы. Да, symfony и php не плох, но spring и java намного кручи, и дает такие возможности которые в php не сделать.


    1. TimsTims
      27.03.2019 01:23

      Замените слова php, symfony, java и spring на любые другие слова, и ваша аргументация ничуть не пострадает. «Он не плох, но этот ещё лучше!». А чем плох, чем лучше не понятно.


      1. ivorobioff
        27.03.2019 08:24
        -1

        Ну я не статью пришел здесь писать. Говорю свое сугубо личное мнение. О том чем пхп хуже или лучше джава есть кучу статей включая эту.


        1. TimsTims
          27.03.2019 09:06

          Ну и мы же в комментариях читаем не статьи, а мнения людей, и очень ждём аргументов. А вы вроде и написали адекватный комментарий, что у вас был большой опыт, но почему что-то лучше — не написали. Выходит, вы зря написали свой комментарий — вроде бы и написали что-то, но ничего не сказали.


          1. ivorobioff
            27.03.2019 09:24

            Где это написано, что комментарии должны обязательно аргументироваться? Я захотел просто и кратко опровергнуть конкретную точку зрения из статьи, где говорится что Spring это система которая вызывает анальную боль, а вот Symfony это бомба.
            В своем комментарии я обобщенно описал свое ощущение перехода от одного инструмента к другому. Ощущения не аргументируют. Нужны аргументы читайте статьи.


          1. poxvuibr
            27.03.2019 09:32

            Автор написал, что ему spring не понравился потому что он какой-то сложный и вообще, а ему комментатор ответил, что комментатору спринг сложным не кажется, а кажется намного круче. Уровень аргументации примерно одинаковый. Что не так?


  1. Khaperets
    27.03.2019 01:04

    В каждом языке есть свои плюсы и недостатки, грамотный разработчик под свою задачу найдет нужное решение на необходимом языке. По поводу Symfony: работаю более 5-ти лет с этим фреймворком, и для меня это самый лучший каркас для разработки PHP-приложений. Всегда использую последние версии языка/фреймворка и с выходом Symfony 4 & PHP 7 — просто сказка, приложения получаются лаконичными и очень качественные во многих аспектах.


  1. kuftachev
    27.03.2019 01:58
    -1

    У меня на PHP реальный опыт только на Yii2, который, к сожалению устарел.


    Я вот тоже раньше любил шутки про PHP, пока не посмотрел в сторону Python, который официально принято всячески хвалить. После этого я понял, что PHP — это очень крутой современный язык, а это ещё до PHP 7 было.


    Но к Symfony отношусь скептически, когда его смотрел, эта была попытка сделать Spring на PHP, в общем, все грустно как-то.


    Сейчас, в связи с постепенным уходом на пенсию Yii2, перешли на Go под новые проекты. Реально довольны, он просто вне конкуренции.


    1. Soo
      27.03.2019 07:10

      в связи с постепенным уходом на пенсию Yii2

      А почему это Yii2 собрался на пенсию? Его совсем никто-никто не поддерживает?


      1. asd111
        27.03.2019 08:07

        Автор китаец, который написал 99% фреймворка, ушёл из проекта пару лет назад.


        1. olegl84
          27.03.2019 12:47

          И что? Если посмотреть по коммитам, то Yii2 живет. Пока для себя я альтернатив не вижу. Laravel медленнее работает, на Symfony медленее писать.


          1. EvgeniiR
            27.03.2019 13:20

            на Symfony медленее писать.

            Статистикой не поделитесь? Сколько я не видел людей которые рассказывают как быстро они на Yii круды пишут, на вопросы почему у них этого не получается на других фреймворках типичный ответ: «Ну я пришел к бизнесу сказал так то так то, я знаю Yii, но не знаю Laravel, поэтому на Yii писать проекты быстрее», а потом идут этот же тезис доказывать остальным.

            P.S. я не видел проектов которые с 0 переходят в статус 100% готовности и отутствия необходимости в поддержке после того как разработчик CRUD через gii сгенерировал, а как только придется что-то кастомизировать, поддерживать и дорабатывать, вся скорость улетучивается.

            Laravel медленнее работает,

            PHP тоже медленее работает. Почему же вы на нём пишете вообще?)
            И уверены ли вы что скорость работы вашего приложения действительно упирается во фреймворк, а не в БД, например?


            1. olegl84
              27.03.2019 13:37

              Статистикой не поделюсь. Есть только личный опыт, есть проект на Symfony и Yii. На сифони нужно больше кода писать + больше кода в самом фреймфорке(в основном абстракций), то есть дольше разбираться в нюансах работы.

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


              1. EvgeniiR
                27.03.2019 16:36

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

                Ну то есть даже полноценных бенчмарков не было. Ок.
                p.s. 30rps не серьёзно, у вас горлышко будет вовсе не в ЯП если конечно не будете ССЗБ

                больше кода в самом фреймфорке(в основном абстракций), то есть дольше разбираться в нюансах работы.)

                В моём понимании, абстракция — сокрытие несущественных деталей, и если абстракция мешает вам пользоваться фреймворком, есть два варианта:
                1. Вы явно делаете что-то не так.
                2. Абстракции некачественные, контракты ломаются. Но тогда хотелось бы от вас примеры таких абстракций

                По поводу лапшекода — да, когда у вас проект на пару тыс. строк возможно писать процедурщину забив на разделение ответственностей и coupling будет и быстрее и понятнее, но чуть времени и вы даже не заметите как это всё превратится в трудноподдерживаемое легаси


                1. olegl84
                  27.03.2019 17:27

                  Абстракция и реализация абстракции все же разные вещи. То есть там где у Yii 3-4 класса, то у Symfony задействовано 7-10. И вместо классов интерфейсы, то есть без запуска отладки очень не просто, если вообще возможно найти конкретную реализацию.

                  Ну я не считал кол-во строк, но проектам которые я делаю скоро по 5-10 лет, и я всегда в Yii с лекостью нахожу и понимаю код который мне надо менять. Другое дело сами изменения. Но тут я не думаю что проблема в Yii или Symfony, тут вопрос статичесой/динамической типизации + покрытия тестами. Моя лично практика показывает что в PHp важшее простота, а не «правильноть». Все эли SOLID созданы для типизированых языков, и там да, проблема будет если код не гибкий, а PHP гибкий by design.


                  1. VolCh
                    27.03.2019 20:05

                    В каких ситуациях вам нужна конкретная реализация? документация контракта недостаточная или ошибки прут из реализации?


                    1. olegl84
                      27.03.2019 20:08

                      читать код вместо документации.
                      Документация не полная касательно нюансов или не всегда можно быстро найти нужное место


                1. Source
                  28.03.2019 21:58

                  30rps не серьёзно, у вас горлышко будет вовсе не в ЯП

                  Это из серии "Снимаю порчу по фотографии, определяю горлышко по кол-ву rps"?


  1. Travelcamnet
    27.03.2019 02:51

    А мне нравится Yii2 )))


    1. FRiMN
      27.03.2019 08:29

      На мой вкус есть сомнительные решения в нем.


      1. olegl84
        27.03.2019 12:52

        Какие?


        1. EvgeniiR
          27.03.2019 13:25

          1. Велосипеды, крайне неудобные и некастомизируемые
          2. Глобальные переменные
          3. Статика
          4. Программирование на массивах
          5. Ужасные AR модели, которые по сути God-object`ы
          6. Меньше ограничений, вызов Yii::$app в html шаблоне — типичное дело. Да, конечно, это проблема скорее программистов, но вышеперечисленное плюс ужасные практики навязанные документацией, в совокупности с тем что половина пользователей используют Yii потому что даже Английский не осилили( и, соответственно, ничего больше не знают ) = низкий уровень разработчиков и ужасные проекты.


          1. olegl84
            27.03.2019 13:44

            Что на ваш взгляд лучше?


            1. EvgeniiR
              27.03.2019 16:43

              Фаулера читать лучше всего ) Сразу приходит осознание, что ничего вобщем то нового в этих всяких фреймворках нету.
              А так, Symfony, Laravel — стильно, модно, молодежно и по функционалу впереди, и с перечисленными пунктами всё получше. Zend вроде вполне годная штука, но я так и не смотрел его, к сожалению.


              1. olegl84
                27.03.2019 17:31

                Когда я читал фулера, я все это знал на своей личной практике.
                Lravel под капотом — это упражнения автора в интелектуальном труде, то есть там сделано умно, но когда мне надо быстро разобраться я предпочитаю «просто».
                Symfony это всегда не нужный расход ментальной энергии. Возможно проблема в том, что я пишу PHP проекты в одиночку, в команде конечно наверно лучше Symfony, но я бы выбрал .NET Core MVC.


                1. EvgeniiR
                  27.03.2019 20:55

                  Если вы пишите в одиночку и каких-то больших перспектив у проекта нет, вообще без разницы )


              1. olegl84
                27.03.2019 17:59
                -1

                Ешё на счет Laravel, сейчас это вроде поправили, но когда я его смотрел последний раз там предлагалось валидировать модель в контролере. После Yii это казалось дикостью. А в Symfony вообще нету такого понятия как модель в Yii, где класс имеет встроенную поддержку валидации и отображения. Все это надо прикручивать самому и каждый будет это делать по своему. ну не знаю… Конечно все независимо и разделено, но а надо ли разделение функционала ради разделения, это большой вопрос. На мой взгляд в лучше логически связаные вещи объеденять.


                1. VolCh
                  27.03.2019 20:08
                  +1

                  В Symfony есть понятие модель с точки зрения MVC и оно означает «модель вашего приложения вне фреймворка». Ну и логически валидация и отображение не должны быть объединены с моделью. Одна и та же может может иметь разные режимы валидации и отображения. Это связь один-ко-многим.


                  1. olegl84
                    27.03.2019 20:16

                    Модель очень редко имеет различные отображения (названия полей и их описаие на человеческом). Даже не часто есть разные схемы валидаций. Но в Yii есть поддержка разных сценариев валидаций из коробки, смену отображения тоже легко изменить.


                    1. michael_vostrikov
                      27.03.2019 20:26
                      +2

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

                      Нормальная архитектура в Yii выглядит примерно так. У вас есть форма со списком полей и правилами валидации, есть представление, в которое она передается. В контроллере на POST-запрос вызывается метод сервиса, куда передается провалидированная форма. В сервисе уже находится бизнес-логика, где делаются вычисления, создаются AR-модели, заполняются данными из формы и сохраняются. Сервис это просто отдельный класс, который не наследуется от классов фреймворка.


                      1. olegl84
                        27.03.2019 20:35

                        Я вроде не говорил что модель должна быть обязательно AR. Но вообще, да норм решение если проект чуть больше или много разных форм.


                        1. VolCh
                          27.03.2019 20:37

                          Как по мне, то такое решение должно быть по умолчанию и только очень веские причины должны быть для использования «магии» формовалидированнойхранимойсущности.


                      1. olegl84
                        27.03.2019 20:44

                        Вообще я лично всегда выношу бизнес логику в отдельные класссы. Но вот сохранение там бы я не делал, сложнее тестировать.


                        1. michael_vostrikov
                          27.03.2019 21:00

                          А где его делать при использовании ActiveRecord, в контроллере?)


                          1. VolCh
                            27.03.2019 21:03

                            В ActiveRecord можно сделать хорошую мину при плохой игре и запретить смешивать в одних методах логику хранения и логику валидации


                            1. michael_vostrikov
                              27.03.2019 21:20
                              +1

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


                              1. VolCh
                                27.03.2019 22:28

                                Я про то, что если даже смешать всё в одном классе по каким-то очень веским причинам, то «бить по рукам» за методы со множественной ответственностью. Ну и, условно, вместо штатного метода validateAndSave вызывать отдельно validate, а затем save, если нет отдельного save, то сначала validate, а потом validateAndSave


                                1. michael_vostrikov
                                  28.03.2019 00:15

                                  Это все правильно, только у меня вообще validate в AR-моделях нет. Если и есть, то только для проверки заполнения полей с внешними ключами, и то больше как дополнительный контроль. Все validate в классах для приема внешних данных (формах).


                    1. VolCh
                      27.03.2019 20:29

                      Как по мне, то очень часто разные в зависимости от контекста. Например, модель сущности Person имеет поле name. В одном контексте это может быть «имя заявителя», в другом «имя агента», в третьем «имя сотрудника» и т. п. И имя заявителя может быть пустым, а имя сотрудника всегда должно быть полным, а имя агента не доолжно быть пустым, но допускает скоращения.


                      1. olegl84
                        27.03.2019 20:39

                        Да, зависит от масштаба проекта. Но в большестве случаев это не надо. И тут возникает дилема, либо мы унифицируем в сторону более сложного решения и получаем оверхед в простых случаях, или делаем просто, и в сложных случаях применяем альтернативное решение. Исходя из моего лично опыта, в PHP второй вариант предпочтительние, потому что я пишу один. Возможно в команде нужны другие подходы.


                        1. VolCh
                          27.03.2019 21:09

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

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


              1. olegl84
                27.03.2019 18:11

                раз уже завязалась дисскусия, то разберу ваши пункты:
                1. Велосипеды, крайне неудобные и некастомизируемые
                Они аргументируют что их велосипеды удобные, хотя по функционалу хуже. И лично я согласен. Тот же логгер проще чем monolog, но и не может выводить в консоль.
                2. Глобальные переменные
                Какие ещё глобальные переменные. Если имеется ввиду Yii::$app, то это по смыслу константа, а в лобальных константах нету зла.
                3. Статика
                Не люблю как это реализовано, приходиться самому допиливать, но а как сделать лучше и универсально я не знаю сам. Ведь такая реализация там не спроста, она позволяет легко интегрровать визуальные extensions.
                4. Программирование на массивах
                обожаю. она из основных причин почему использую Yii. С Yii2support плагином единственное решение которое лаконично и удобно. yml например не поддерживается IDE. у xml поддержка весьма ограниченая. в Laravel с этим лучше, но массивы я люблю больше :)
                5. Ужасные AR модели, которые по сути God-object`ы
                В Yii есть те же репозитории как в Symfony, подозреваю что вы не владеете информацией в нужном объеме
                6. Меньше ограничений, вызов Yii::$app в html шаблоне — типичное дело.
                Не вижу особой проблемы, это плохо лишь в том случае, если нам надо будет использовать код в другом, не Yii проекте. Но это очень редкий случай и все равно надо будет инджектить все эти классы. Можно либо реализовать свой Yii:$app или сделать просто Find & Replace.


                1. VolCh
                  27.03.2019 20:10

                  > В Yii есть те же репозитории как в Symfony, подозреваю что вы не владеете информацией в нужном объеме

                  В Symfony нет репозиториев. Там вообще практически ничего нет, относящегося к управлению постоянными данными.


                  1. olegl84
                    27.03.2019 20:22

                    В моем приложении на Symfony есть рипозитории сделаные в соответствии с оф. документацией. Не вижу сильной разницы что там неймспес начинается с Doctrine. Она идет в поставке


                    1. VolCh
                      27.03.2019 20:30

                      Нет её в поставке, её нужно устанавливать типа composer install orm


                1. EvgeniiR
                  27.03.2019 21:14
                  +1

                  Причем тут репозитории?
                  Пихать бизнес логику, логику отображения, логику persistence слоя, валидацию в один класс это ужасно.
                  Могу с уверенностью предположить что у вас не было опыта с другими фреймворками, и не было крупных проектов, поэтому вопрос для вас по сути религиозный. Не хотел переходить на личности, просто ответ на ваши замечания потянет на книгу.
                  Все же, кратко:
                  — Read model и Write model могут различаться. Для быстрого и дешёвого проектирования сделать их одинаковыми — норм вариант. С ростом проекта, без рефакторинга, условная сущность Product обрастает просто гигантским количеством логики, зависимостей, и в принципе становится тяжело поддерживаемой. В этот момент возникает вполне резонный вопрос — почему вся эта логика в классе Product? Почему Product должен знать про то как рассчитать цену. Почему Product должен знать каким должно быть описание, почему он вообще знает про SEO и то что нельзя, допустим, располагать в описании тег h4 до h3. Что если бизнес завтра скажет что продукт может быть без цены? Править конструктор в котором 25 аргументов и вызывается он в 150 контроллерах? Что если появляется логика того как должна отображаться цена, и это значение не подходит для операций? Пихать в Product помимо price поле user-friendly-price? Почему это не сущности ProductDescription и Product price? Гуглить CQRS, агрегаты.

                  Yii::$app — не константа. Это объект через который модно вытащить любую информацию о приложении. Тут уж просто советую гуглить global coupling.

                  P.s. я пишу на Юи(Легаси), использую его, можно сказать, в полной мере. К сожалению. Постепенно планируем от него отказываться.


                  1. olegl84
                    28.03.2019 13:03

                    Увереность вас подводит. 20 лет опыта, C#, Delphi, Java, Php. Самый большой проект — больше миллиона евро бюджета


                  1. olegl84
                    28.03.2019 13:06

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


                    1. VolCh
                      28.03.2019 13:08
                      +1

                      Как язык от количества человек зависит?


                      1. olegl84
                        28.03.2019 13:18

                        В больших командах статически типизированый язык на много безопастнее


                        1. VolCh
                          28.03.2019 16:20

                          Ну вроде по статистике недавней самый опасный язык — Си.


                          1. olegl84
                            28.03.2019 16:22

                            Это точно :) Но Си не такой уж и типизированый, работа с памятью там небезопастная, записать и прочитать можно какой угодно тип.


                  1. olegl84
                    28.03.2019 13:17

                    То что вы описали в «Все же, кратко:», это вопрос не к фреймворку, а к разработчику. Если у вас сложная логика в одном классе, то это проблема не фреймворка, а архитектора проекта.


  1. youyou2020
    27.03.2019 05:25

    Нормальные ребята изучают другие языки


    1. hatman Автор
      27.03.2019 06:48
      +2

      Я всегда думал, что:

      • цель любого разработчика — решать задачи оптимальным способом
      • цель человека — хорошо зарабатывать, вкусно кушать и не дрочить себе мозг без особой необходимости

      Причем тут нормальные ребята и языки — я не в курсе.


  1. GrigoryPerepechko
    27.03.2019 05:38

    TL;DR;
    Питон — только джанга, остальное фигня
    Java — сложно, ну нафиг
    PHP — симфони класс, всем рекомендую


    1. hatman Автор
      27.03.2019 06:46
      +1

      Добавить 4 пунктом: Современные фреймворки на PHP/Python/Java/.NET — одно и то же по сути.


      1. IvanNochnoy
        27.03.2019 13:00
        +1

        Дьявол в деталях


  1. ttys
    27.03.2019 06:47
    -1

    Какое то очередное облизование пхп


  1. FRiMN
    27.03.2019 08:22

    Плюс документация Django – одна из самых качественных, что я видел

    Все стало ясно. Хотя это уже холивар


  1. lonesimba
    27.03.2019 08:28
    -1

    Фреймворки это, конечно хорошо, но есть долбодятлы люди (вроде меня) кто работает на чистом PHP, без фреймворков. Вот тут веселье и боль идут. Особенно по ООП. Ну и отсутствию ИДЕ, по функционалу хотя бы похожих на Эклипс\Студию, которые бы не стоили как фотошоп… хотя может я просто не нашел еще его, тогда был бы рад, если бы пальцем ткнули в ссылку.


    1. hatman Автор
      27.03.2019 08:29

      А зачем? какая цель всего этого дела?


      1. lonesimba
        27.03.2019 08:31

        Свою CMS делаю, как диплом, плюс буду для себя ее использовать. Не хочу иметь внешние зависимости, по максимуму от них отказываюсь. Хотя некоторые вещи (типа mobile detect или jquery) оставлю, добиться аналогичных функций самостоятельно тут будет сложновато


        1. EvgeniiR
          27.03.2019 09:52

          http://youmightnotneedjquery.com — не благодарите )


          Ну а писать проект не используя внешние библиотеки это, конечно, ужас.


          1. lonesimba
            27.03.2019 10:16

            Интересная вещица, спасибо. JQuery я больше "на всякий" написал, поскольку пока только бэкэнд делаю ещё.


        1. Virviil
          27.03.2019 10:46

          В чем смысл делать диплом в 2019 году на jquery? Это же всё-таки не кровавый энтерпрайз, а диплом!
          Я понимаю ещё CMS с Wasm на фронте и блокчейном на бэке. Но диплом на PHP с jquery...


          1. lonesimba
            27.03.2019 10:54

            Затем, что я его и без диплома делал бы. Да и дипломы у нас в шараге — сплошняком сайты-визитницы. Если под Wasm подразумевался webAssmebly, то это уже выше моего понимания на данный момент, да и узнал я о нем только что от Вас, хотя он выглядит интересно, поизучаю его однажды. А блокчейн на бэке… в ВУЗе, может, диплом и должен впечатлять, но в рядовом колледже, вроде моего, где если хочешь научиться, то гуглишь сам, диплом — просто больше для галочки. Да и с блокчейном у меня не задалось — майнить не вышло нормально, GTX760 не подходящий агрегат, а в рамках предварительного этапа WS мне с тремя товарищами так и не удалось сеть поднять, хотя руководил всем чел, шарящий за это дело.


    1. poxvuibr
      27.03.2019 09:45

      Ну и отсутствию ИДЕ, по функционалу хотя бы похожих на Эклипс\Студию, которые бы не стоили как фотошоп… хотя может я просто не нашел еще его, тогда был бы рад, если бы пальцем ткнули в ссылку.

      PhpStorm сейчас стоит 89 долларов за первый год, 71 за второй и с третьего года стоит 51 доллар в год. В рублях это примерно 5800, 4600 и 3300 соответственно. Вот ссылка https://www.jetbrains.com/phpstorm/buy/#edition=personal .


      Фотошоп стоит 3400 в месяц, а в год это 40800. Ссылка https://www.adobe.com/ru/creativecloud/plans.html


      Легко убедиться, что фотошоп более чем в 10 раз дороже, чем PhpStorm. Так что бегите, покупайте уже сейчас, или дождитесь скидки, в Jet Brains это бывает часто. А если вы студент, то все IDE Jet Brains для вас попросту бесплатны.


      1. lonesimba
        27.03.2019 10:11

        ГБПОУ МГОК в их реестре студенческих организаций точно не состоит — да и студент я только до лета, а там армия. Если бы у них был аналог Visual Studio Community или Life-long лицензия, тогда бы рассматривал, а так, для проекта "для себя" без дохода, покупать даже за такую божескую цену, но каждый год — непозволительная роскошь для меня. Сейчас, по крайней мере, пока я в маке работаю. Хотя там скорее всего буду на .Net буду работать, а пыха уйдёт на второй план


        1. hatman Автор
          27.03.2019 10:12

          Напишите представителям JetBrains на хабре. Мне в свое время годовую лицензию PyCharm подарили для личных проектов на python (хотел пощупать django). Там ребята весьма адекватно идут на встречу.


          1. lonesimba
            27.03.2019 10:18

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


        1. Fenzales
          27.03.2019 13:33

          ГБПОУ МГОК в их реестре студенческих организаций точно не состоит
          Вряд ли у них есть какой-то реестр, просто смотрят наличие актуального студенческого билета.


          1. lonesimba
            27.03.2019 13:42

            Не, они требуют почту в домене учреждения.

            Пикрелейтед
            image


        1. NickyX3
          27.03.2019 14:19

          Для людей типа вас, любящих «чистый» php есть довольно легкий подрезанный Zend Eclipse PDT, бесплатный. Правда он старый и в нем плохо с поддержкой php7, но в целом ок. И даже кое-какие плагины от нормального Eclipse поддерживаются типа ColorTheme


          1. lonesimba
            27.03.2019 14:26

            Это не тоже самое, что Eclipse IDE for PHP Developers? Просто его пробовал пару раз, но что-то не понравилось, не помню уже что.


            1. NickyX3
              27.03.2019 14:41

              Не совсем, это сборка от самих Zend с их фичами типа поддержки «Project on Remote Server over SFTP/FTP», которая есть в Zend Studio, но в PDT (Community Edition) for Eclipse оно вырезано.
              В общем на самом деле это чуток подрезанная старая версия Zend Studio.


              1. lonesimba
                27.03.2019 14:48

                А, ну это уже слишком продвинуто для меня. Мне, по факту, только IntelliSense нормальный нужен, а то он теряется с подсказками в VSCode, когда я пишу конструкции типа:

                Пример 1
                <?php
                public class Lol
                {
                 private $foo;
                
                 public function __construct() {
                     $this->foo = new Foo();
                 }
                
                 public function Hi() {
                     $this->foo->bar(); //Подсказок по функциям не выведет
                 }
                }
                


                1. sumanai
                  27.03.2019 21:16

                  В смысле теряется? На каком этапе у вас отсутствуют подсказки?


                  1. lonesimba
                    27.03.2019 21:31

                    Когда ввожу $this->foo — никаких подсказок порой не возникает. То же самое происходит, если я класс в процедурном файле вызываю. Но опять же — не всегда. Может, конечно, дело в неймспейсах, не знаю.


                    1. VolCh
                      27.03.2019 22:30

                      а нет indexing в статусбаре, когда порой не возникает?


                      1. lonesimba
                        27.03.2019 23:34

                        Перенастроил немного, как в расширении PHP IntelliSense Феликса Бейкера написано, чтоб php.suggest.basic было false. Если раньше выводило таки предложения, просто ни одна из функций членом класса, который в переменную положен, не была, то теперь же он вообще только то, что внутри класса, в котором я пишу выводит. Это если внутри класса. А в процедурном стиле выводит нормально. Если что, у функций видимость public стоит

                        скрины
                        image
                        тыц
                        без класса
                        image
                        тыц
                        в классе


                        1. sumanai
                          28.03.2019 00:48

                          Кстати, когда это классы приобрели модификаторы видимости?


                    1. michael_vostrikov
                      28.03.2019 00:22

                      Вообще это обозначается через PHPDoc


                      /** @var Foo */
                      private $foo;

                      Если VSCode их не обрабатывает, может какие-то плагины есть.


                      1. lonesimba
                        28.03.2019 00:27

                        так я по примеру выше говорю — что $foo — экземпляр класса Foo, и если обращаться через $this->foo->… то подсказки по содержимому класса нет, если же $foo->..., и происходит это все не в классе, а просто в скрипте, то есть. См. комментарий в ответ на VolCh


                        1. michael_vostrikov
                          28.03.2019 00:33

                          Ключевой момент в моем комментарии — первая строчка в сниппете кода) Это не просто комментарий в коде, он реально парсится редакторами специализированными для PHP.


                          1. sumanai
                            28.03.2019 00:55

                            В VSCode кажется только как документация. По крайней мере код типа

                            <?php
                            
                            /**
                             * Undocumented function
                             *
                             * @param string $string
                             * @return void
                             */
                            function test($string)
                            {
                                //
                            }
                            
                            test([]); // тут ошибка: вызов функции с неверным параметром
                            

                            Не выдаёт каких-либо ошибок, в отличии от кода
                            <?php
                            
                            function test(string $string)
                            {
                                //
                            }
                            
                            test([]); // тут ошибка: вызов функции с неверным параметром
                            

                            В PHPShtorm иначе?


                            1. michael_vostrikov
                              28.03.2019 01:00

                              Я про автокомплит говорил. Но первый вариант вроде тоже подсвечивается как ошибка.


                              1. sumanai
                                28.03.2019 01:38

                                Занятно. Впрочем VSCode не IDE, походу не всё возможно с редактором. Надо бы ошибку в багтрекер кинуть.
                                Автокомплит по функциям в VSCode работает, если указать тип переменной или он очевидно выводится. А вот тип переменных, увы, только по самому коду.


                      1. sumanai
                        28.03.2019 00:50

                        Да в общем-то не обязательно, по крайней мере в случае lonesimba всё работает и так. Но да, PHPDoc штука полезная.


                    1. sumanai
                      28.03.2019 00:46

                      А класс Foo есть, файл его открыт или добавлен в рабочий каталог? УМВР

                      Заголовок спойлера


                      1. lonesimba
                        28.03.2019 01:00

                        Хм, включил снова Intellephense, который у Вас — заработало. Похоже, одной проблемой меньше, за что огромное спасибо и Вам, и всем, кто помогал разобраться, жаль, оценки не могу ставить — ни карма, ни рейтинг не позволяют. Насчет модификатора класса — выплывший кусок опыта с джавой, каюсь, еще одна вещь для правок. П.С.: — для michael_vostrikov — дело не в документировании кода, а в самом отображении, но проблема оказалась в расширении IntelliSense. Хотя если этот сниппет — не просто документация, а реально что-то большее, то с радостью бы почитал хотя бы кратенькую лекцию по ним. Если что, расширение для доков стоит — PHP DocBlocker


                        1. sumanai
                          28.03.2019 01:45

                          Хм, включил снова Intellephense, который у Вас — заработало

                          Бывает. У меня тоже более популярное периодически отваливалось, забывая комментарии даже для встроенных функций. Кажется даже конфликтовал с другим расширением.
                          Хотя если этот сниппет — не просто документация, а реально что-то большее, то с радостью бы почитал хотя бы кратенькую лекцию по ним.

                          PHPDoc помогает там, где не справляется сам PHP. Например, можно указать класс переменной, если он не выводится напрямую, как это бывает в простых случаях. Или тип глобальной переменной. PHP DocBlocker помогает автоматом генерировать PHPDoc комментарии по /**, больше ничего.


                        1. VolCh
                          28.03.2019 07:31

                          Некоторые построители AST и подобных вещей («парсеры») для PHP воспринимают аннотации как часть языка, соответственно очень сильно влияя на автозаполнение.


      1. franzose
        28.03.2019 04:39

        Можно еще курсы на Степике (stepik.org) проходить и получать бесплатную лицензию. Не помню только срок её действия.


    1. lonesimba
      27.03.2019 17:10

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


      1. vlreshet
        27.03.2019 17:20
        +1

        А что тут объяснять? Практически для любого проекта понадобится как минимум написать такие базовые вещи как роутинг, робота с БД, система шаблонов (views). Писать их самому, вместо использования фреймворка — это строить велосипед, с заведомо худшим качеством, и чаще всего без документации. А ведь это только три базовые вещи, а фреймворки покрывают просто огромную кучу всего. В итоге — если у человека есть возможность использовать фреймфорк, но он этого не делает, то в 99% это плохой специалист который будет писать код который сможет легко поддерживать только он сам (да и то не факт).


      1. EvgeniiR
        27.03.2019 21:30

        У человека явно просто нет опыта, это пройдет очень скоро, с развитием проекта. Пока он не видит в этом проблем, пытаясь как помочь мы либо:
        — Напоремся на механизм психологической защиты
        — Нагрузим его какими-то терминами которые он пока не поймет

        Самай адекватный совет тут — набираться опыта и читать камни. Да, хороший ментор в виде преподавателя или начальника ему очень поможет, но не проходимец с хабра


        1. lonesimba
          28.03.2019 00:09

          Но разве поиск каких-то новых путей решения проблемы или просто нарабатывание опыта не проще производить, не пользуясь конструкторами? А то читал где-то, что верстку ту же лучше начинать в обычном блокноте, чтоб не привыкать сходу к красивостям и удобностям типа Emmet и подсветки синтаксиса, и уметь искать проблемы самостоятельно. Или такой подход не правильный?


          1. vdem
            28.03.2019 00:25

            Про себя могу сказать, что пользуюсь редактором Midnight Commander'а (из вкусностей только подсветка синтаксиса). Не люблю подсказки, вдруг выпрыгивающие когда я код набираю, да и запоминается всё лучше гораздо. Понятно, иногда приходится лезть в документацию или гугл, если забыл аргументы какой-то функции. И вообще, это заодно и удобный файловый менеджер — не надо никуда переключаться и водить мышкой. Но я так, фрилансер, а вот в конторах по-любому заставят на IDE перебраться. Кстати, на Upwork когда я на почасовых проектах работаю, ни один заказчик еще не делал замечания за то, что не использую IDE, хотя же видят скриншоты. Это моё ИМХО, мне просто так удобней.


            1. tendium
              28.03.2019 00:33

              Вы где такие конторы видели, где заставляют пользоваться конкретным IDE?
              Впрочем, вот какой прикол: рост условного юниора из моей команды до условного мидла как-то подозрительно совпал с переходом с Sublime на PHPStorm. Ничего не утверждаю, но совпадение прям заметно…


              1. vdem
                28.03.2019 00:50

                Я не говорил про конкретный IDE, а вообще про IDE. Как бы он повышает производительность труда, не приходится лазить в гугл и в файлы проекта лишний раз. А вообще хз как оно, я уже десяток лет на фрилансе и в офисы больше — ни ногой :) Кстати, думаю такие конторы вполне существуют, где приходится пользоваться принятым в конторе/коллективе набором софта.


              1. VolCh
                28.03.2019 07:35

                В Киеве точно имеются. «Заставляют пользоваться» может не то слово, но должно быть у команды одинаково настроенное окружение с конкретной IDE. При разработке можешь хоть CLI (не TUI) редакторами пользоваться, но если тебе нужна помощь или просто код показать, то будь добр открой «нашу IDE»


          1. franzose
            28.03.2019 04:42

            А то читал где-то, что верстку ту же лучше начинать в обычном блокноте, чтоб не привыкать сходу к красивостям и удобностям типа Emmet и подсветки синтаксиса, и уметь искать проблемы самостоятельно. Или такой подход не правильный?

            ИМХО, это полный бред и самоограничение ради самоограничения.


    1. olegl84
      27.03.2019 18:28

      PHPStorm чем не устроил? только делайте правильные type hints и все будет отлично.


      1. lonesimba
        27.03.2019 19:16

        как бы про Шторм уже говорили в ветке


        1. franzose
          28.03.2019 04:43

          Проходите курсы на stepik.org, периодически будете получать бесплатные лицензии на продукты от JetBrains.


  1. GinoPane
    27.03.2019 10:24

    Мм, спасибо, приятно читать адекватное позитивное мнение :)


  1. Compolomus
    27.03.2019 10:26

    Странно что автор после первого zf не перешёл на второй или третий, zf тоже всегда толкал доктрину. Конфиги после zf крутить уже не такая проблема. Дока конечно не самая хорошая, но материалы есть.
    Симфония не самый простой фв, но и не самый плохой. Есть хорошие фв, но менее популярные из за высокого порога вхождения. Тот же фалькон. Ну и как мне кажется все идёт к midleware
    zend-expressive возможно подтянется


  1. lega
    27.03.2019 11:58

    Если мы отходим от Django в сторону Tornado/aiohtpp/Twisted/Flask итд – то там начинается боль, ибо код в них писать гораздо неприятней, чем в Django.
    Странно, наоборот, если почитать питон комъюнити, то приходишь к мнению, что джанго — это пережиток прошлого, неповороливый фреймворк для узкого типа сайтов, от которого отворачиваются бывалые разрабочики.

    то там начинается боль
    У кого-то боль, а у кого-то начианется свобода…


  1. JamesJGoodwin
    27.03.2019 12:12

    прекрасен и продуктивен
    синхронный язык с блокирующим I/O


    1. michael_vostrikov
      27.03.2019 20:32

      Для каких задач вам нужен неблокирующий IO?


      1. VolCh
        27.03.2019 20:35

        Например, для написания websocket-сервера он очень хорош.


        1. michael_vostrikov
          27.03.2019 20:41

          На PHP можно делать вебсокеты, я делал, ReactPHP кажется использовал.


          1. VolCh
            27.03.2019 21:10

            ReactPHP базируется на/активно использует/сделан для (не знаю как точнее) для неблокирующего IO


            1. michael_vostrikov
              27.03.2019 21:29

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


      1. andreymal
        27.03.2019 21:04

        Например, для любых? Я буквально на днях завалил один php-сайт, тупо отправив несколько десятков связанных с IO запросов (не буду говорить каких и куда конкретно, чтоб школохацкеров не приманивать), потому что все php-fpm воркеры взялись за IO, а свободные тупо кончились.


        Ну и из очевидного вебсокеты, разумеется, тоже. А также long polling и x-mixed-replace, если «классику» вспоминать.


        1. andreymal
          27.03.2019 21:33

          Хотя, справедливости ради, это относится ко всему синхронному с небезлимитным числом воркеров, к Django в том числе


        1. michael_vostrikov
          27.03.2019 21:36

          А в других языках свободных воркеров достаточно? Как я понимаю, это не проблема языка, а проблема настройки сервера.

          Вебсокеты на PHP тоже можно делать. С остальным я не сталкивался, возможно там у PHP есть недостатки.


          1. andreymal
            27.03.2019 21:56

            Настройкой сервера можно лишь увеличить число воркеров до некоторого предела (оперативка не бесконечная всё-таки) и несколько облегчить проблему, но принципиально проблему это не решит.


            Про вебсокеты в php вам уже сказали, что они как раз асинхронные и неблокирующие. Тем не менее, мейнстрим (тот же вордпресс, например) всё ещё синхронный.


            Ну да, в языке нет поддержки, но либы же есть.

            Либы это неудобное вкостыливание сбоку с callback hell'ом, для хорошей асинхронщины нужен async/await, ну или горутины :)


            1. molchanoviv
              27.03.2019 22:33

              Кстати в пхп даже есть корутины которые можно в асинхронном режиме гонять прямо из веб реквеста не поднимая отдельного reactphp сервера и не ставя swoole. Правда сделаны они пока через генераторы, что как по мне немного криво. В восьмерке обещают впилить libuv и сделать io неблокирующим, тогда и появится нормальная асинхронщина.

              З.Ы. а то, что библиотеки это вкостыливание это ты зря. В том-же котлине корутины это тоже библиотека, но лучшей реализации корутин я не видел.


              1. andreymal
                27.03.2019 22:53

                в пхп даже есть корутины

                Это хорошо, но тогда странно, что гугл по поводу вебсокетов предложил мне пачку библиотек именно с callback hell'ом


                сделаны они пока через генераторы

                Ну в Python 3.3 корутины и асинхронщина тоже через генераторы, но вроде бы неплохо получилось, лично мне нравится


                В том-же котлине

                Как я понял из документации, там всё же есть соответствующая фича самого языка, некие «suspending functions», поверх которых запилить удобную асинхронщину уже не так трудно


                Фичи php это хорошо, осталось только дождаться, чтобы они до мейнстрима наконец доехали)


              1. sumanai
                28.03.2019 00:58

                Правда сделаны они пока через генераторы, что как по мне немного криво.

                Можно пример кода?


                1. molchanoviv
                  28.03.2019 11:02
                  +1

                  Конечно можно. Я для этого использую библиотеку recoil. Так-же есть статья от nikic-а о том как это работает.

                  class MyClass {
                      private function foo(): ?\Generator
                      {
                          // код не использующий IO
                  
                          yield;
                      }
                  
                      private function bar(): ?\Generator
                      {
                          // код не использующий IO
                  
                          yield;
                      }
                  
                      private function baz(): void
                      {
                          // запуск таск менеджера Recoil. Не путать с ReactPHP. Стартовать его нужно лишь раз, там где нужно использовать асинхронность. можно конечно и во фронт-контроллере стартовать если нужно использовать асинхронность во всем приложении, но пока не сделают IO неблокирующим в этом будет мало смысла.
                          ReactKernel::start(
                              function () {
                                  yield $this->foo(); // запуск одной функции в асинхронном режиме
                                  yield [ // запуск нескольких функций параллельно
                                      $this->foo(),
                                      $this->bar(),
                                  ];
                              }
                          );
                      }
                  }
                  


    1. rdifb0
      28.03.2019 01:05

      I/O легко становится неблокирующим с stream_set_blocking(). А синхронность в некоторых случаях можно заменить кооперативной многозадачностью через генераторы.


      1. VolCh
        28.03.2019 07:36

        Доступ к СУБД будете через stream_set_blocking() писать?


        1. rdifb0
          28.03.2019 16:09

          Через mysqli_poll().


          1. VolCh
            28.03.2019 16:22
            +1

            А если не MySQL?


  1. transcengopher
    27.03.2019 16:34

    Непонятно вот это:


    Auto-wiring Symfony – даже работает очевидней, чем DI в Spring

    Что такого неочевидного в DI Spring'а, который фигачит всего по двум параметрам — имени компонента и его типу (если имени не указано)?
    С симфонией я не знаком, зато знаком со Spring, и проблемы с тамошним DI не встречал вообще ни разу (все проблемы на поверку оказались проблемами с AOP).


    1. VolCh
      27.03.2019 20:14

      Не помню Spring (лет 10 прошло), но в Symfony достаточно просто в сигнатуре метода контроллера или другого сервиса указать что-то вроде (UserRepository $repo, Request $request) и больше никакой конфигурации.


      1. transcengopher
        28.03.2019 17:11

        Ну да, а в Spring нужно будет метод пометить как @Autowired. Конфигурации тут прямо жуть как много и неочевидно.

        Но то, что вы описываете, когда метод вызывается с параметрами из контекста, спрингом поддерживается только там, где спринг ваши методы вызывает сам, а он этого практически не делает там, где в основном применяется. Вот в методах ответа на rpc-call — делает, и там иногда так можно объявить. В AOP — тоже делает, но там контекст очень маленький, и всего мира так не получить.

        Если же метод вызывает ваш код, и компоненту будет нужен объект из DI — придётся либо напрячь вызывающий код, либо объявить зависимость всего компонента, через аннотацию на его поле. Потому что вы не можете вызвать метод в Java и передать только часть параметров, чтобы фреймворк «дописал» в конец списка ещё что-то «недостающее» — это в Java называется oveloading, и через Spring решается опять же инъекцией в поле. В сухом остатке получается, что Spring сложный потому что нужно в объекте поле объявить? Странная логика, как по мне.


  1. Yo1
    27.03.2019 17:01

    с высоты 15+ лет опыта и даже опыта с php+pl/sql прожектов, в изучении пхп нет особого смысла. даже совсем пых-пых сайтику когда-нибудь понадобиться что-то из ML или задеплоить в сервислес амазон. проще один раз вложиться и выучить что-то серьезное, чем распыляться на несколько технологий лишь потому, что там проще вход. та же жава со spring boot думаю уже на порядок меньше конфигурации потребует, чем старичок Symfony. у spring boot в том и идея, что уже все сконфигурено по дефолту и готово подняться.
    ну и по деньгам — учить пхп просто не выгодно.


    1. olegl84
      27.03.2019 18:30

      А что мешает задеплоить PHP на амазон и прикрутить ML?
      И если вы такой крутой с 15+ опыта, то заявление «учить» PHP странно выглядит, там не понятно что учить. Профи за 3 месяца осилит.


      1. Yo1
        27.03.2019 20:23

        самый модный из серверлес (AWS Lambda) пхп нативно не супортит, самый модный из ML — гуло тензорфлоу нативного пхп интерфейса не имеет. наверно через какие-то враперы можно заколхозить, но придется изучать и тот язык и этот и костыли-сишные экстеншены которые кто-то в свободное время колхозил под php-tensorflow.
        я потому и профи, что знаю, в том числе и какая хрень за каждой «простой на вход» технологией кроется. сам уже с тем самым пхп уже выплачивал, за выход из той простоты. платил за zend encoder, рисовал генератор ёкселя через опу к джаве. вход в пхп был простой, но еще 10 лет назад даже xls в пхп сгенерить было нечем


        1. olegl84
          27.03.2019 20:28

          Ну то что PHP НЕ лучший вариант для это задачи это ясно. Но например если я знаю только PHP и нету времени на изучение нового, то на AWS Lambda вроде можно запустить PHP и биндинги есть для tensorflow от разработчика PHP.


          1. Yo1
            27.03.2019 21:48

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


            1. sumanai
              28.03.2019 00:59

              причем даже на самых хайповых темах.

              ИМХО, но только на хайповых темах.


            1. oxidmod
              28.03.2019 12:25

              aws.amazon.com/blogs/apn/aws-lambda-custom-runtime-for-php-a-practical-example

              По поводу ML, а в чем собственно проблема использовать подходящий под задачу язык?


              1. Yo1
                28.03.2019 13:25

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


                1. oxidmod
                  28.03.2019 14:34

                  Какой секас по ссылке? лямбда нативно поддерживает пхп от недавнего времени


                  1. Yo1
                    28.03.2019 17:36

                    тот что по ссылке, с компиляцией пых-пых из исходников и подготовкой custom runtime

                    Before we get started, we should take a moment to consider how native language support on Lambda behaves and how the custom runtime API differs.

                    Since there’s no native support for PHP in Lambda, we’ll need to provide the PHP binary for Lambda to use so that we acn execute our custom runtime code.

                    перевод нужен?


            1. qbz
              29.03.2019 02:41

              Yo1 istinu glagolish.


        1. michael_vostrikov
          27.03.2019 20:29

          В PHP можно генерировать специальный XML, который Экселем неплохо открывается.


        1. vdem
          27.03.2019 20:56

          Как раз ~10 лет назад я для какого-то бельгийца переводил из Perl пакет Write_Excel, или как там он назывался, на PHP, вместе с тестами :)
          P.S. Но вроде PHPExcel тогда уже был, это я гораздо позже узнал, правда наверное в зачаточном состоянии.


    1. VolCh
      27.03.2019 20:24

      Symfony 4+ совсем не старичок, и как раз по конфигурации прежде всего. По сравнению что было в 2 (вы же знаете, что symfony 1.х и Symfony 2+ — это совершенно разные проекты?) — практически несравнимые вещи.


  1. kivsiak
    28.03.2019 02:26
    +2

    Я прекрасно понимаю автора вот есть ситуации когда сложно отказаться. Но в чем смысл статьи в 2019? Пхп наконец то стал языком на котором можно писать?

    Я честно без сарказма рад за пхп. Это тот язык на котором я заработал и первый рубль и первый доллар. Я был его большим фантом еще во времена 4.x и был сильно рад переходу на 5.3 ( я думаю тут еще есть люди что помнят этот переход и все те позитивные эмоции)

    И тут я вспоминаю свой 2009 год. Когда мне пришлось столкнуться с java c питоном… с ruby. Работа потребовала выбраться из уютного мирка. И тут я понял что движуха не в пхп. Зенд симфони (2009 год напомню) прут все с рельс с джанги с спринга. Чувствуешь себя вечно догоняющим. Где-то появляются новые технологии. Потом смена специализации на java + python. И тогда статьи на пхп можно писать демонов, мы почти побороли утечки, наши фреймворки ниче так, почти рельсы, почти джанга, почти спринг… Зато у нас низкий порог входа.

    Прошли годы… Запустить проект на джанге, на рельсах, на спринге может и мартышка. Появилась нода. Появился го. Наработаны и внедрены практики. Можно делать сервлесс (тот еще базворд) инфраструктуру. Лямбды, облака, Async, Движуха.

    И вот 26.03.2019 в статье я читаю что мы наконец-то имеем шаблоны не хуже чем в джанге orm уровня рельс и тайпхинтинг. Добро пожаловать обратно на пхп?

    И вопрос кто аудитория этого поста? Те кто серьезно завяз на пхп? Ну voloch на пхп даст фору любому джависту с пхп он никуда не слезет.

    Те кто давно на java? Их язык уже давно ушел вперед со времен java 6. Если им станет скучно у них есть java 12, есть котлин, есть скала.

    Рубисты давно свали на ноду и го. А те кто остались посмотрели и сказали о прикольно эти нас наконец догнали.

    Питонисты хмыкнули чекнулись кружками с явистами и пошли дальше писать на 3 питоне.

    Причем я говорю не только о языке. Все альтернативы имеют зрелую и в тоже время развивающийся экосистему. Я очень рад что композер перестал тормозить. Но это эти проблемы уже решены лет 10 как. В других языках.

    И что я вижу. Опять поддержка легаси… дешевые программисты… Все ровно те же аргументы что я слышу 10 лет.

    Вот только за последние 2 года мне приходится не сколько писать сколько руководить.И вижу, что есть адекватные java инженеры за меняемые деньги, Стало до фига джангистов разного уровня. Прототип мне проще взять ребят что пишут на Nodejs и React. Старые асскалы насильники что на go пишут. Молодые джуны но уже понимающие практики. Пхп? Да есть адекватные сеньеры — пхп их сознательный выбор они на любом языке будут писать хорошо.

    Фреймворки либы на любой вкус и язык.

    И вот к чему вся телега выше.

    2005 год релиз php4.4 альтернатив в своей нише нет кроме перла.
    2019 год — разнообразие альтернатив под конкретную специализацию. пхп опять в роли догоняющего.

    Почему я должен начать писать свой проект на PHP?


    1. hatman Автор
      28.03.2019 04:45

      Почему я должен начать писать свой проект на PHP? — без понятия, я свои личные проекты тоже пишу не на пхп, пишу их на джанго.

      Почему работаю на пхп — это хорошая продуктовая компания, которая платит выше рынка, и на работе мне не трахают мозги. Разве надо что-то еще?

      Что касается владельцев бизнеса, то я уже объяснял, что компании на ПХП — это достаточно зрелые компании, которым дешевле всего переводить свои легаси проекты на ПХП — на современный симфони, нежели как-то перелазить на другую технологию. И опять же, на что ты будешь переписывать:

      java/.net? — добро пожаловать в мир конкуренции за прогеров с банками, нефтяными компаниями, телекомом итд.

      Ruby/Python — ну руби потерял свою популярность в РФ и «умер», какова вероятность, что Python не последует за ним.

      node.js/go — ну это совсем для других задач.

      В итоге, бизнес выбирает ПХП