Ответы пользователя по тегу PHP
  • Как вы бы ускорили этот php код?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Почитайте чего на тему разделения ответственности

    Так же если вы считаете что "страничка медленно загружается" - надо профилировать.

    1. На уровне браузера - просто в дебагере посмотрите что именно медленно грузится. Возможно медленно скачиваются сами картинки.
    2. На уровне страницы - возможно сервер далеко расположен. А может страничка медленно генерится.
    3. На уровне PHP - есть отдельные профайлеры, начать можно тупо с логирования времени выполнения отдельных кусков кода. Заканчиваем специализированными инструментами вроде blackfire.io.
    Ответ написан
    Комментировать
  • Существует ли реализация полиморфизма для HTTP и CLI запросов в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нет. Есть отдельно библиотеки которые предоставляют вам абстракцию от HTTP и абстракцию от CLI. Сверху затем вы можете сделать свою обертку. Я вот сделал для себя но оно больше для http - в cli я просто могу замэпить данные.
    Ответ написан
    Комментировать
  • Создать простую админку?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    но можно ли на чистом джс такое сделать?


    Можно. Angular (или чего попроще) + firebase и вперед. Для вашей задачи - норм.
    Ответ написан
  • Нужно ли разкидывать загрузчики классов по разным классом, чтобы сохранить принцип единой ответственности?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    и объявляет глобальные вспомогательные переменные.


    про автозагрузку вам уже ответили - используйте composer. А на счет глобальных "вспомогательных" переменных - избавьтесь от них. Используйте контейнер зависимостей или сервис локаторы для управления зависимостями и конфигурации системы.

    Либо учитесь делать изолированное состояние - либо просто забейте и пишите процедурно как во времена php4. В этом нет ничего страшного, подавляющее большинство даже не знают о том что у них процедурщина с классами.
    Ответ написан
    Комментировать
  • Оптимально ли написан код?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) для таких вещей не очень удобно использовать регулярки. Разбирать xml/html регулярками вообще вредно
    2) логичнее в тег pre ничего не добавлять что бы ненароком не удалить лишнего. Вдруг там по замыслу автора уже стоял тег
    .
    3) проще сразу убрать лишние строки или еще круче - завернуть их в параграфы.
    Ответ написан
    2 комментария
  • Как лучше разбить логику?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Пытаюсь понять SRP


    Давайте думать. Вот есть у вас класс который:

    - занимается аутентификацией пользователя
    - занимается регистрацией пользователя
    - занимается восстановлением пароля

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

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

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

    p.s. маленький вброс: https://gist.github.com/fesor/33f041e3f362beff8d0e...
    Ответ написан
    1 комментарий
  • Сокет-сервер на PHP для приёма данных от GPS-маяка. У кого какие мысли?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    У кого какие мысли на этот счёт?


    tcpdump, netcat и вперед к написанию своих серверов (если оно поверх TCP работает). Вы просто учтите что скорее всего там сверху свой протокол какой. Можете поискать реализации на node.js и попробовать портировать на php.
    Ответ написан
    Комментировать
  • Стоит ли все function собирать в одном файле?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Стоит ли все function собирать в одном файле?


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

    И стоит ли плодить около 5-10 функций для разборчивости кода?


    Стоит. Это называется декомпозицией. Когда вы одну большую задачу (отобразить страницу) дробите на маленькие подзадачи. Велик шанс что на других страницах что-то из этого пригодится. Да и просто так удобнее. Маленькое проще править чем большое.
    Ответ написан
    5 комментариев
  • Имеет ли смысл использовать SPL структуры данных в php с выходом 7й версии?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    собственно в самой статье приводятся бенчмарки отдельного расширения для php которое вводит замену spl-ским структурам. Вывод мне кажется напрашивается сам собой. Это расширение даже предлагалось в ядро впихнуть но только на уровне хотелок.

    В целом все зависит от задачи а именно алгоритмов которые вы используете. В некоторых задачах использование массивов невыгодно, но таких задач для похапэшников мало.
    Ответ написан
  • Пару вопросов по MVC. Поможете?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    что посоветуете?


    1) забудьте об MVC на минутку. Пока мы будем говорить о "модели". Так же пока забудьте о представлении, HTML и т.д. Только PHP, только хардкор.
    2) вынесите все действия в отдельные классы, что-бы у вас был по объекту на действие
    3) вынесите все дублирование в отдельные объекты (это что бы конкретизировать что подразумевается под вторым пунктом) и вынесите все в зависимости
    4) поскольку у вас стало много объектов - воспользуйтесь контейнером зависимостей
    5) для работы с базой данных имеет смысл организовать DAO например. То есть что бы все что относится к SQL что бы было как-то сокрыто в них а не размазано по всем объектам. Так же можете почитать на тему Table Data Gateway.

    То есть у нас должно сформироваться некое API. Нам нужны новости - достаем объект, который умеет их доставать. Нужно что-то еще - для этого чего-то тоже найдется объект умеющий это. Как он будет это делать - дело третье.

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

    Дабы устранить дублирования UI-ки имеет смысл выделить отдельные компоненты (например блок с последними новостями - отдельный UI компонент). То есть страница будет собираться как-бы из кусочков.

    Ну как-то так.
    Ответ написан
    Комментировать
  • В каком месте mvc системы должен находиться шаблонизатор?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1. шаблонизатор - это просто компонент. Они ничего не знает о MVC и прочем булшите
    2. шаблонизатор нужен там, где формируется view. Вы можете крутиться как хотите, но view на бэкэнде пассивно (это http ответ) в подавляющем большинстве реализаций (даже в ADR от которого нынче писают кипятком), а это значит что формироваться view будет в контроллере. Отсюда делаем вывод что шаблонизатор должен дергаться в контроллере а такого компонента как view у нас просто нет. Возможны хэлперы которые помогают формировать этот самый view но не более.
    3. управление зависимостями не входит в зону ответственности MVC. Оно обычно где-то сверху, тут можно заюзать Dependency Injection (только готовый контейнер если, свой не пишите).
    4. трейты в контроллерах нормальная тема просто потому что на код контроллеров нам должно быть плевать с высокой колокольни. Если вам не плевать на код контроллеров - возможно вы там делаете что-то чего контроллеры делать не должны. Ну и опять же это будет трейт который будет делегировать задачу шаблонизатору а не реализовывать его.
    5. что-то мне подсказывает что "модель" в вашей системе координат это какой-нибудь класс для работы с базой данных. Если так - вы не поняли зачем вообще вводится это разделение.
    Ответ написан
    Комментировать
  • Как выполнить php скрипт в tpl?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Комментировать
  • Как осуществить ограничение на количество запросов к API?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    гуглить "Rate limit"
    Ответ написан
    Комментировать
  • Как использовать Принцип подстановки Барбары Лисков применительно к PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В PHP отсутствует Double Dispatching и перегрузка методов


    Double Dispatch в PHP:

    class Foo {
        // ...
        public function makeSomeStuff(Bar $bar)
        {
             $bar->doStuff($this->someData); // double dispatch!
        }
    }


    Перегрузка методов:

    class Foo {
        public function foo() {}
    }
    
    class Bar extends Foo {
        public function foo() {} // перегружен!
    }


    и в ответ на отличающуюся от базового класса/интерфейса сигнатуру он вывалится с ошибкой


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

    Но решить проблему как-то нужно


    Перегрузка методов в наследниках с изменением сигнатуры это как раз таки нарушение принципа подстановки барбары лисков (LSP для сокращения).

    > Сервисы должны имплементировать какие-то общие методы, но помимо этого у них есть и специфичные методы.

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

    p.s. венгерская нотация - это ужас. Все эти префиксы и суффиксы которые показывают кто есть тип (интерфейс, абстрактный класс) это вещи которые ломают всю красоту идеи полиморфизма и абстракции. Если хотите можем об этом пообщаться отдельно.

    Однако каждый из хендлеров может не работать с конкретной реализацией сервиса.


    Значит полиморфизм в нашем случае пошел погулять. Есть куча решений данной проблемы, в частности Chain of responsibility.

    > Visitor. Предполагает наличие в каждом из хендлеров методов типа handleService1(Service1 $service) и handleService2(Service2 $service), при этом один из методов остается пустым

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

    > Массив маппинга, который говорит, какой хендлер может обрабатывать какой из сервисов.

    Опять же излишнее усложнение.

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

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    чем вас не устраивает call_user_func_array?

    p.s. ответ на ваш вопрос есть в документации по рефлексии.
    Ответ написан
    3 комментария
  • Друзья, каким образом изменить значение свойства $b (прибавить единицу) у каждого объекта класса T, заданного в конструкторе класса G?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) var - не используйте это ключевое слово. Используйте public. А еще лучше - private.
    2) инкапсуляция, закон деметры. Не меняйте состояние объектов напрямую. Используйте сообщения (вызовы методов).
    3) вот эти свистоплязки с динамическим созданием имен переменных лишены всякого смысла
    4) имена классов, свойств, методов и вообще должны быть осмысленны. Вы должны быть в состоянии, ну не знаю, прочитать код вслух! и что бы всем вокруг все было понятно.

    class T{
        private $b;
        private $s;
    
        public function __construct() 
        {
             $this->b = mt_rand(0, 1000);
             $this->s = 'foo';
        }
    }
    
    class G
    {
        public function __construct(array $t) 
        {
              // ...
        }
    }
    
    $g = new G(array_map(function () {
        return new T();
    }, range(1, 4));
    Ответ написан
  • Чат на сокетах в связке с пхп?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Идеальный вариант - nodejs + socket.io + pub/sub на каком zeromq. Этот способ наиболее эффективне ибо адекватной реализации websocket сервера на PHP как бы нету.

    Во всяком случае вместо полумертвого ratchet лучше поковырять какой https://github.com/walkor/Workerman

    Еще есть более простой вариант - quickblox - BaaS решение и все такое. Подключили и юзайте. Там есть SDK для js.
    Ответ написан
    4 комментария
  • MVC как правильно, объясните некоторые моменты?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    контроллер - прослойка между View (HTTP, а не шаблоны как думают многие разработчики), и Приложением (моделью). Потому то они и тонкие что они занимаются исключительно конвертацией представления данных модели в предаставление клиента (не обязательно человека, а например клиентом может выступать браузер или другая программа).

    Пример экшена контроллера из моего проекта:

    public function registerUserAction(RegisterUserRequest $request, RegisterUserHandler $handler)
    {
        $user = $handler($request);
    
        return $this->resource($user, UserTransformer::class)->withStatusCode(201);
    }


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

    Вот и вся соль.

    Рекомендую вам пока отложить изучение MVC, поскольку к web оно имеет относительно никакого отношения, важна лишь идея разделения обязанностей, снижения связанности и т.д.

    Почитайте про GRASP и SOLID. В GRASP описана идея контроллера очень хорошо.
    Ответ написан
    4 комментария
  • Почему PHP не видит класс через namespace?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Просто так все не происходит, особенно если у вас два класса из разных пространст имен лежат рядом.

    Гуглить про автозагрузку классов. Функции spl_autoload_register и в принципе почитайте про composer-вский автозагрузчик.
    Ответ написан
    2 комментария
  • Как сделать удаления переписки?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ответ как бы напрашивается - не удалять а прятать для конкретных юзеров.
    Ответ написан
    2 комментария