• Правильно ли наследовать класс от синглтона?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Если нет, то почему?

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

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

    А наследоваться от класса singleton не правильно как минимум с точки зрения LSP (Liskov Substitution Principle)
    Ответ написан
    8 комментариев
  • Почта для домена: gmail vs. яндекс

    @psthv2
    У меня есть действующая доменная почта для гугла и яндекса. Если кратко:
    Google Apps Яндекс
    Платно — бесплатно
    Фильтры плохи — хорошие
    Скорость загрузки низкая — высокая
    Возможность пересылать несколько писем отсутсвует — присутсвует
    Удобство гугл аккаунта как единственного аккаунта — нет такой опции
    Интерграция с гугл диском и гугл докуементами есть — жалкое подобие в виде яндекс диска
    Синхоронизация контактов с телефоном отличная — через жопу
    Интерфейс ногу сломаешь — отличный
    Встроенный календарь отличный — говно
    Возможность встраивать приложение для почты (например плагины для систем управления проектами) прямо в веб-морду gmail — нет таких опций (насколько мне известно).
    Возможность отправлять письма с задержкой с помощью сторонних платных приложений — бесплатная встроенная возможность.
    Возможность создавать любое количество псевдонимов для почты — можно использовать в качестве псевдонима формат типа <номертелефона>yandex.ru
    Приятный интерфейс написания нескольких писем без закрытия основного веб-интерфейса — нет такого интерфейса.
    Нет уведомления получателя по СМС — есть такое уведомление.

    Функциональность Gmail огромна, но во многих местах реализована не шибко юзерфрендли.
    Ответ написан
    2 комментария
  • Как правильно реализовать ООП класс базы данных с PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я уже отвечал как-то на подобный вопрос. И не один раз. И не два.
    Поскольку мозги всех пользователей пхп ходят по одним и тем же рельсам, не сворачивая. Впрочем, не всех. 85% всю жизнь продолжают писать mysl_query, которую выучили из видеоурока, и не видят в этом проблем. И только у самых талантливых 15-и процентов в какой-то момент возникает мысль ВСЁ АВТОМАТИЗИРОВАТЬ. Это, на самом деле, хороший знак. Такое желание как раз и отличает потенциального программиста от клепальщика гуано-кода.

    Но всё портит недостаток знаний в SQL. Искренне полагая SQL не более чем key-value хранилищем, они всерьез уверены в том, что функция select() с двумя аргументами - это все что им надо.

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

    После этого понять, что существует ТРИ класса классов для работы с БД:

    1. DB-хелпер. Класс, берущий на себя всю грязную работу по исполнению запросов. В случае с ПДО не сильно-то и нужен. Позволяет исполнять любые запросы. НИКАКИХ функций типа select(), ограничивающих функциональность, в нем быть не должно ни в коем случае.
    2. Query builder. Функция типа select() может быть только в квери билдере, который маскирует SQL в функции РНР. Заведомо ущербен по сравнению с первым, но зато позволяет использовать запросы более сложные, чем ORM.
    3. ORM. То, что начинающему пользователю на самом деле нужно, но он об этом просто не догадывается. Как раз та самая волшебная палочка, которая делает примитивное доставание данных из базы по первичному ключу столь маняще единообразным.

    Cамое главное, что надо понять:
    Все вышеперечисленное - это РАЗНЫЕ типы классов, не имеющие между собой ничего общего.
    И не пытаться под видом первого городить нежизнеспособное второе, имея в виду третье. Надо очень четко понимать, что сначала делаем первое, а потом, на его основе - либо второе, либо третье. Но не все вместе.

    А можно не пытаться изобретать велосипед, а использовать готовое. Например - популярный фреймворк. Тогда желаемая функция будет выглядеть вот так:

    public function viewUser($id)
    {
        return User::model()->findByPk($id);
    }

    Это в самом предпочтительном случае - при использовании ORM.
    На квери билдере это будет что-то вроде
    public function viewUser($id)
    {
        return DB::select('*')->from('users')->where("id", '=', $id);
    }


    При этом можно использовать и чистый SQL. Запрос прямо в классе юзера - это не так уж и страшно. Тем более, что есть такие запросы, которые по другому просто не выполнишь. Другое дело, что всю работу по исполнению запроса должен брать на себя хелпер. Пример можно посмотреть по ссылке выше - там хоть и SQL , но того ужаса, который здесь, нету:
    public function viewUser($id)
    {
        $sql = 'SELECT * FROM users WHERE id=?';
        return DB::prepare($sql)->execute([$id])->fetch();
    }
    Дальнейшую работы над классом можно производить только после того как ты определишься, какой именно класс ты хочешь написать.
    Ответ написан