Ответы пользователя по тегу PHP
  • Как обработать кириллические хештеги?

    @Flying
    Есть официальная библиотека от Twitter которая, в частности, предоставляет функциональность экстракции хэштегов (пример для JS).

    Если смотреть в код то там будет видно что реальный regexp формируется из кусков и его суммарный финальный размер весьма велик (думаю несколько кб). Кроме того есть ещё одна проблема, уже специфическая для PHP - библиотека PCRE, используемая как движок регулярных выражений для PHP не поддерживает Unicode Surrogates, выдавая для них ошибку Error 73 disallowed Unicode code point.

    Я в своё время для одного проекта конвертировал реализацию из библиотеки Twitter для PHP, если нужно - можно забрать здесь. Там правда есть небольшое отличие в обработке mentions т.к. нужно было учесть специфику Instagram, ну и то что касается специфики работы PCRE, см. выше.
    Ответ написан
    Комментировать
  • Имеет ли смысл создание корневого класса с описанием магических свойств в 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 комментария