Ответы пользователя по тегу PHP
  • Имеет ли смысл создание корневого класса с описанием магических свойств в PHP?

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

    Представьте что вы будете использовать какой-либо framework или внешнюю библиотеку - там не будет этих методов. Представьте что какой-то из ваших классов не требует подобного функционала - тогда наличие этих методов будет нарушением принципа SOLID.

    В целом подобный функционал обычно необходим только для классов используемых для хранения данных (value objects, entities, кастомные струкруры и т.п.). Для них можно создавать подобные базовые классы (хотя для entities, например в Doctrine, принято использовать getters / setters) либо же использовать traits. Для классов же отвечающих за логику приложения этот функционал просто не нужен.

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

    Также многие IDE (например PHPStorm) умеют генерировать getters / setters по описанию полей класса, это существенно экономит время на создание подобных классов. Кроме того они, при описании корректных PHPDocs позволяют писать намного более безопасный код беря на себя проверки совпадения типов и т.п.

    Я в своё время писал библиотечку для создания произвольных структур которая как раз реализовывала подобный функционал и, хотя она в целом получилась довольно удачной - практика показывает что у такого подхода есть масса ограничений.
    Ответ написан
    Комментировать
  • Рационально ли внедрять зависимости в класс через DI-контейнер, обходя при этом стороной конструктор и сеттеры?

    @Flying
    В целом это считается плохой практикой. Приведу ссылку на соответствующий кусок из документации DI контейнера в Symfony: https://symfony.com/doc/current/components/depende...

    Доставая зависимости непосредственно из контейнера вы лишаете себя массы преимуществ внедрения зависимостей:
    • Страдает тестируемость класса т.к. вы не можете подменить сервисы на нужные вам во время тестов
    • Вы лишаете себя возможности валидации целостности графа зависимостей в случае если используется компилируемый контейнер (как, например, в Symfony)
    • Вы привносите в класс излишнюю информацию о названиях конкретных сервисов которые вы достаёте из контейнера
    • Вам потребуется дополнительно проверять есть ли каждый из сервисов в контейнере и что же именно вы достали из контейнера (через instanceof)


    Уверен что есть и другие факторы, это то что пришло на ум в первую очередь.
    Ответ написан
    Комментировать
  • Как лучше всего уложить поле для морского боя в массив байт?

    @Flying
    По-моему ответ на вопрос будет зависеть от цели такой упаковки.

    Для runtime'а вполне можно использовать и "раскрытый" массив, он ведь небольшой. А если цель в достижении минимального размера и не предполагается runtime доступ и изменения без распаковки - я бы смотрел на вариант упаковки с сохранением не поля, а кораблей - максимально получается по 10 бит на корабль:
    • 7 бит позиции
    • 2 бита на тип корабля
    • 1 бит ориентации (для "однопалубных" можно пропустить)

    Думаю что можно ещё больше оптимизировать если хранить не абсолютный отступ, а относительный от предыдущего, тогда скорее всего можно будет "влезть" в байт на корабль и 10 байт в сумме.
    Ответ написан
    7 комментариев
  • Почему скрипт выгрузки из Instagram долго выполняется?

    @Flying
    Время выполнения самого запроса к Instagram API вполне можно проконтролировать непосредственно, например через cURL:
    curl -v -o "https://api.instagram.com/v1/users/self/media/rece..."

    То что сам скрипт ничего не выводит, возможно говорит о том что происходит разрыв соединения по timeout'у (либо timeout самого PHP либо timeout веб-сервера). Для первого нужно смотреть значение параметра max_execution_time в php.ini (по-умолчанию 30 секунд) второй зависит от типа веб-сервера.

    Также "пустая" страница вполне возможна в случае если произошла фатальная ошибка, а вывод сообщений об ошибках выключен. Нужно посмотреть в лог ошибок PHP (который предварительно, возможно, надо включить) либо временно включить отображение ошибок через ini_set('display_errors', true);
    Ответ написан
    4 комментария