• Как запретить кеширование js файла?

    @kulaeff
    Front-end developer
    Ну, раз вы упомянули Google Analytics, то и сделайте как у них. А у них сделано так: юзеры подключают мааааленький скриптик (загрузчик), код которого вряд ли когда-либо поменяется и единственная работа которого - загрузить основной скрипт. Допустим, ваши партнеры в данный момент подключают ваш скрипт с такого урла blabla/script.js. Вам нужно код из script.js вынести в другой файл (например, main.js), а в script.js написать загрузчик, который будет подгружать этот main.js. В таком случае для ваших партнеров все пройдет прозрачно и им не придется ничего у себя менять.
    Ответ написан
    Комментировать
  • Как зарефакторить много isset вызовов в методе?

    uDenX
    @uDenX
    PHP Developer
    Что-то типа того:
    $requiredParams = ['1', '2'];
    $requestParams = [];
    
    foreach ($requiredParams as $param) {
        if (!array_key_exists($param, $params) {
            //Кидаем исключение
        }
    
        $requestParams = $params[$param];
    }
    Ответ написан
    2 комментария
  • Почему в Symfony при сравнении на null - null в первом операнде?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Чтобы избежать возможность ошибочного написания присваивания вместо сравнения.
    Подробнее про Yoda Notation.
    Ответ написан
    Комментировать
  • Почему в Symfony при сравнении на null - null в первом операнде?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    чтобы избежать случайного присвоения
    Ответ написан
    Комментировать
  • В чем смысл библиотеки ReactPHP? Какие задачи решает?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Асинхронность - это выполнение параллельных операций в одном потоке; Мультитрединг, очевидно, в нескольких. Блокировка потока исполнения, вроде функции sleep, а не использование таймера - блокирует поток исполнения (внезапно! Ваш кэп). Надо быть феерически наивным, чтобы ожидать чего-то иного =)
    Ответ написан
    1 комментарий
  • В чем смысл библиотеки ReactPHP? Какие задачи решает?

    Caravus
    @Caravus
    DevOps
    1) Берём событийную библиотеку
    2) Пишем в коде sleep(10);
    3) ???
    4) Пишем на тостер вопрос "а чёж оно блокирует то?!".
    Ответ написан
    4 комментария
  • Как правильно протестировать такой класс?

    @xfg
    Тестировать нужно только публичные методы класса. Вообще лучше внедрить внешние сервисы которые отвечают за сохранение и выгрузку в конструктор этого класса, замокать работу с базой/выгрузку и написать чистый юнит-тест. Такие тесты будут быстрыми, короткими и легко поддерживаемыми. На самый важный функционал сайта потом можно будет написать несколько медленных функциональных тестов. И всё, этого вполне достаточно. Сейчас же вы хотите интеграционный тест написать. Уродливый, медленный, с кучей лишнего бойлерплейта. В этом очень мало смысла. Нужно писать юнит-тесты на свой код и только для важных фич типа оплаты или регистрации писать функциональные тесты. Интеграционные тесты не писать вообще. Помните, каждая лишняя написанная вами строка кода, требует вашей дальнейшей поддержки в будущем. Пишем тесты, которые дают наибольший результат при минимуме кода.
    Ответ написан
    Комментировать
  • Зависимости внутри системы лучше строить от интерфейсов или абстрактных классов? Когда лучше использовать абстрактный класс и когда интерфейс?

    qonand
    @qonand
    Software Engineer
    Абстрактный класс позволяет частично реализовать функциональность и указать что должно быть реализовано в потомках, это удобно как для базового класса. Но использовать его в качестве реализации механизма зависимости не стоит, т.к.:
    1. Могут возникнуть ситуации когда понадобиться реализовать класс не наследуясь от абстрактного класса.
    2. Один класс может использоваться в нескольких зависимостях и для каждой из них может быть свой набор обязательных характеристик. В этом случае Вам придется "раздувать" базовый класс что не хорошо.

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

    По-моему зависимости внутри системы от интерфейсов более гибкие.

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

    LoggerInterface

    В каждом ОО-языке свои конвенции именования интерфейсов, но скорее всего лучше назвать просто Logger. Вы же не пишете Class в конце имени каждого класса.

    Подскажите, пожалуйста, как правильно определить когда использовать интерфейс и когда абстрактный класс?

    Интерфейс - когда хотите описать контракт взаимодействия, иными словами, сгруппировать несколько методов. Вся фишка интерфейса в том, что его можно реализовать только полностью, а не частично.
    Абстрактный класс - когда хотите предложить некоторую частичную реализацию. Это может быть как реализация ранее описанного интерфейса (что более чем нормальная ситуация), так и абстрактный класс с собственными публичными (в том числе абстрактными) методами. Во втором случае вы одновременно описываете некий интерфейс и тут же - его частичную реализацию, которой сможет воспользоваться класс-наследник.
    Ответ написан
    Комментировать
  • Как считается key_len в команде EXPLAIN MySQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Показывается используемая длина ключа в байтах.
    INT - 4 байта и есть. И длина int'а всегда 4 байта, та циферка в скобках - ни на что не влияет в плане хранения, используется в некоторых клиентах для выравнивания отображения таблицы и только.
    Ответ написан
    1 комментарий