Никогда не поздно учиться

tarya

Новичок
Добрый день друзья. Никогда не поздно спросить простые вещи чтоб научиться делать правильно.

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

Как правильно в коде все это оформлять? В месте где ты хочешь сделать запись нужно подключить класс, инициализировать его и потом уже в $message->addMessage("krya-krya"); Тоесть пару строчек каждый раз. Или лучше в родительском классе создать метод в котором будет подключение класса и дергание всего что нужно, и тогда все это будет одна строка $this->addMessage("krya-krya");

Спасибо за ваше время и советы.
 

С.

Продвинутый новичок
Подключать класс можно по умолчанию.
Класс тоже можно явно не инициализировать: Мessage::add("krya-krya");
 

tarya

Новичок
Спасибо. Просто хочется делать сразу правильно. Но такие вопросы не особенно часто рассматриваются.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
tarya, не следует в методе класса подключать system-wide класс, вообще не стоит что-то подключать руками, если уже давно есть composer
 

stalxed

Новичок
tarya,

Ваш вопрос делится на 2 темы.
1) Инклуд.
Собственно лучше сразу придерживаться стандартов:
http://www.php-fig.org/psr/psr-0/
http://www.php-fig.org/psr/psr-4/

Свои библиотеки можете инлудить используя http://symfony.com/doc/current/components/class_loader/index.html

Свои часто используемые библиотеки, как Вам сказали выше Absinthe, c0dex, можно оформить как composer пакеты.
Если будите использовать psr-0 или psr-4 - это сделать относительно не трудно.

2) Инициализация.
Тут главное пока поймите принцип внедрения зависимостей.
Воспользуемся примерами.
ТАК ДЕЛАТЬ НЕЛЬЗЯ!
PHP:
<?php
class Main
{
    public function someMethod()
    {
        // some action

        $message = new Message();
        $message->addMessage("krya-krya");
    }
}
Вместо этого необходимо использовать:
a) внедрение зависимости через конструктор:
PHP:
<?php
class Main
{
    private $message;

    public function __construct(Message $message)
    {
        $this->message = $message;
    }

    public function someMethod()
    {
        // some action

        $this->message->addMessage("krya-krya");
    }
}
б) внедрение зависимости через setting method:
PHP:
<?php
class Main
{
    private $message;

    public function setMessage(Message $message)
    {
        $this->message = $message;
    }

    public function someMethod()
    {
        // some action

        $this->message->addMessage("krya-krya");
    }
}
в) внедрение зависимости через method arguments:
PHP:
<?php
class Main
{
    public function someMethod(Message $message)
    {
        // some action

        $message->addMessage("krya-krya");
    }
}
После этого начинаются проблемы в виде того, как управлять горой подобных зависимостей.
Мне кажется, даже для новичка, лучше использовать контейнер сервисов от symfony http://symfony.com/doc/current/components/dependency_injection/index.html
Да, вещь не простая.
Но она помогает сразу правильно мыслить и не делать ошибок в ООП архитектуре.

По поводу
Спасибо. Просто хочется делать сразу правильно. Но такие вопросы не особенно часто рассматриваются.
Ещё как часто.
Все книги про ооп как раз про вторую часть моего ответа.
Крайне советую классику(если знаете английский, ищите и читайте на английском, перевод ужасен):
http://www.ozon.ru/context/detail/id/1573723/

Ещё тут упоминали про:
Подключать класс можно по умолчанию.
Класс тоже можно явно не инициализировать: Мessage::add("krya-krya");
Плохой совет!

Да, Singleton, Registry, Facade - тоже являются методами внедрения зависимостей.
Но лучше статические классы, Singleton, Registry, Facade не использовать, если не знаешь ООП на достаточном уровне.
Просто море примеров видел, где эти технологии несут море вреда.
Но в умелых руках они полезны в ряде ситуаций.
 
Последнее редактирование:

stalxed

Новичок
tarya, ещё, по поводу логирования событий бизнес логики.
Задача не такая простая в контексте ООП(отделить/оторвать логирование от кода, выполняющего бизнес логику).

Лучшее, что я видел http://symfony.com/doc/current/components/event_dispatcher/introduction.html
По сути этот компонент паттерны Observer и Mediator. В гугле много информации по ним.

Море теории, принципов, паттернов, библиотек - просто чтобы залогировать сообщение соблюдая все принципы ООП?
Ужас, да...
Но когда система доходит даже до средних размеров, то это всё окупается с лихвой.
 
Сверху