Отчет о состоянии объекта

craz

Нестандартное звание
Трейты подходят как нельзя лучше, так как именно подмешивают нужный функционал, и в тоже время архитектурно не будут наследоваться. Это самое то короче. Я просто не понимаю, почему вы не понимаете?) Ну да есть xdebug, var_dump и иже с ними, но мне кажется логирование все таки нужно настраивать каким-то образом, причем логирование не уровня дебага, а логирование поведения всего ПО.
 

fixxxer

К.О.
Партнер клуба
Мы не понимаем, потому что обычно объект получает тем или иным способом depencency management-а instanceof LoggerInterface и логирует сам, что считает нужным, а не отдает что-то наружу.
 
  • Like
Реакции: craz

craz

Нестандартное звание
Мы не понимаем, потому что обычно объект получает тем или иным способом depencency management-а instanceof LoggerInterface и логирует сам, что считает нужным, а не отдает что-то наружу.
ну то есть надо именно наследование? я об этом и спрашивал вообще-то...
 

fixxxer

К.О.
Партнер клуба
craz
Я не понимаю, как ты не понимаешь! Ты, прости за вопрос, фреймворки видел современные или только битрикс?

PHP:
class Foo {

   public function foobar() {
        // не суть важно откуда взялся $this->logger
        $this->logger->log('Here I am: ' . var_export($this, true));
   }

}
 

craz

Нестандартное звание
craz
Я не понимаю, как ты не понимаешь! Ты, прости за вопрос, фреймворки видел современные или только битрикс?

PHP:
class Foo {

   public function foobar() {
        // не суть важно откуда взялся $this->logger
        $this->logger->log('Here I am: ' . var_export($this, true));
   }

}
Видел в ZF2 такое реализовано, мне почему то это не нравиться... Это делегирование кстати?

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

craz

Нестандартное звание
craz
ты код то начнешь писать или будешь думать еще часа 3?)
да пишу я его пишу) не переживай) это видишь где размещено? В теории, это начит что я не пишу а узнаю как теоритески верно будет расположить данный компонент.

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

Ну в крайнем случае написать самому.
 

fixxxer

К.О.
Партнер клуба
Видел в ZF2 такое реализовано, мне почему то это не нравиться... Это делегирование кстати?
Это обычные взаимодействующие классы. ООП в основном про это.

То, что ты хочешь, если я понимаю, что ты хочешь - это как раз нарушение принципов разделения ответственности в ООП:

PHP:
class Model {

     public function getStringForLogger() {
         return var_export($this, true);
     }

}

class Controller {

    public function actionDefault() {
         $model = new Model;
         $logger->log($model->getStringForLogger());
    }

}
тут контроллер зачем-то знает, что у $model есть какой-то getStringForLogger, и что это можно сунуть логгеру, хотя это вообще не его собачье дело.
 

fixxxer

К.О.
Партнер клуба
Если ты хочешь сделать "логируемые объекты", то есть, передаешь логгеру объект и объект решает, что о себе рассказать, это другое дело, это делается так:

PHP:
interface LoggableInterface {
     public function logTo(LoggerInterface $logger);
}

trait LoggableTrait {
     public function logTo(LoggerInterface $logger) {
         $logger->log(var_export($this, true));
     }
}

class Foo implements LoggableInterface {
    use LoggableTrait; // или своя реализация logTo()
}

class Logger implements LoggerInterface {
    // ...
    // тут был бы полезен method overloading, но раз его в php нет, делаем отдельный метод
    public function logLoggable(LoggableInterface $loggableObject) {
         $loggableObject->logTo($this);
    }
    // ...
}

$foo = new Foo;
$logger->logLoggable($foo);
 

AmdY

Пью пиво
Команда форума
Есть ещё варинат с АОП
Но у тебя в логах будет куча мусора, особенно учитывая то самое делегирование в реальных объектах.
 

fixxxer

К.О.
Партнер клуба
В жопу все, что связано с АОП, пока не появится нормальная поддержка базовых аспектов в php (хотя бы pecl extension-ом).

Я понимаю, когда phpdoc парсится при деплое в кэш (ОРМ там какая-нить), или в юнит тестах.

Но делать это все время в рантайме? В жопу.
 

fixxxer

К.О.
Партнер клуба
Вот взяли бы все эти разработчики AOP библиотек и составили proposal по _минимально необходимой_ поддержке в php.

Так, чтобы было достаточно для того, чтобы не парсить phpdoc и покрыть базовые кейсы, но и не засовывать весь функционал AOP-либ подряд в php.

Я даже начну: можно реюзать собачку перед определением метода:

PHP:
class Foo {

    @someable
    public function bar() {}

}
все равно она там сейчас бессмысленна так что никаких конфликтов. :)

С функциями, правда, будет облом, но а оно надо?
 

AmdY

Пью пиво
Команда форума
fixxxer
расширения как раз страдают кучей проблем, а вот решения на php с парсингом phpdoc вполне себе, если использовать аккуратно и понемногу.
 

fixxxer

К.О.
Партнер клуба
Расширения страдают кучей проблем, если пытаться в них засунуть все подряд и не давать возможность расширять php-кодом.

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

Вот о таком proposal-е и речь.
 

craz

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

Поэтому интерфейс не подойдет...
 

fixxxer

К.О.
Партнер клуба
Что-то ты слова говоришь понятные а в целом фигня какая то ))

Трейты это множественное наследование частичных классов.
Интерфейс - он и в африке интерфейс, причем тут это вообще.
 

craz

Нестандартное звание
Что-то ты слова говоришь понятные а в целом фигня какая то ))

Трейты это множественное наследование частичных классов.
Интерфейс - он и в африке интерфейс, причем тут это вообще.
Блин ну смотри один проект и второй проект, в одном я все реализовал все логируется как перенести в другой проект?
 

fixxxer

К.О.
Партнер клуба
Что перенести? Библиотеку логирования? Легко, композером подключаешь и все. Или субрепозиторием. Или копипастой на худой конец =)
 

craz

Нестандартное звание
Копипаста да, если интерфейс, то не подойдет...
 
Сверху