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

craz

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

Это должен быть суперкласс? В принципе как вариант наследованию я вижу некую функцию доступную в глобальной области видимости приложения, которая подмешивается в объекты - вопрос только как это можно реализовать?

На практике я хочу иметь возможность дампать любой объект как то так

$someObj->toString();

Вопрос как получить дамп и куда его выводить в данном случае не стоит.
 

Gas

может по одной?
В принципе как вариант наследованию я вижу некую функцию доступную в глобальной области видимости приложения, которая подмешивается в объекты - вопрос только как это можно реализовать?
traits?
 

uid

Новичок
craz
Если каждый объект должен иметь свою логику формирования этих данных - интерфейсы. Если логика создания данных схожа/одинакова - трейты.
 

fixxxer

К.О.
Партнер клуба
Очень путанное объяснение, но если очевидного var_dump|var_export($object) не хватает, наверное, Reflection
 

uid

Новичок
Задача не совсем понятна. Если это нужно для облегчения разработки - давно придуман xdebug, можно в любом месте в скрипте поставить бряк, выполнение остановится на этой строчке, и будут доступны все свойства объекта(если бряк будет в нестатическом методе) и переменные в локальной области видимости. Если же речь идет именно об архитектуре -
Если каждый объект должен иметь свою логику формирования этих данных - интерфейсы. Если логика создания данных схожа/одинакова - трейты.
 

craz

Нестандартное звание
Triats - это похоже то, что бабушка прописала, а как быть если у меня SplClassLoader подключен?
 

craz

Нестандартное звание
Очень путанное объяснение, но если очевидного var_dump|var_export($object) не хватает, наверное, Reflection
нет Рефлектион немного не то, но в принципе, как доп. функционал в эту тулзу тоже надо будет прикрутить.
 

craz

Нестандартное звание
index.php
PHP:
use Craz\Loader\SplClassLoader as Loader;
include_once './library/Craz/Loader/SplClassLoader.php';
$loader = new Loader("Craz","library");
$loader->register();

trait ReportTools{
    public function toString(){
        ob_start(); 
        var_dump($this); $dump = ob_get_contents(); 
        ob_end_clean();
        return $dump;
    }
}
$placesList = new Craz\Entity\PlacesList();
echo $placesList->toString();
PHP:
class PlacesList {
    use ReportTools;
}
Ошибка
PHP:
Fatal error: require(): Failed opening required 'library\Craz\Entity\ReportTools.php

Это если на пальцах.
 

fixxxer

К.О.
Партнер клуба
Я не про это, ну да ладно )

use Craz\Loader\SplClassLoader
И что же там?
Вообще трейты автолоадятся ровно так же, как классы, никакой разницы.
По моему ты забыл указать неймспейс ReportTools ;)
 

craz

Нестандартное звание
Блин зачем зачем) надо так) че в этом не правильного? Любой объект в любой момент может ответить, что ОН знает о СЕБЕ, это разве плохо?

Вообще это часть логирования - я так предполагаю.

https://gist.github.com/jwage/221634
 

craz

Нестандартное звание
Есть более емкие ответы вообще? кроме Gas, вроде ничего путного не предложили.
 

Gas

может по одной?
craz
так уже перечислили вроде всё доступное в php - трейты, рефлексия и базовый класс с методом. Хотя рефлексия для твоего случая это не то, тебе же не снаружи нужно получить, а чтоб сам объект сделал.

это в руби и js можно к прототипам добавлять методы в рантайме
 

Ragazzo

TDD interested
craz
дак ты пытаешься сделать непонятно что так-то, поэтому никто ничего "путного" и "универсального" предложить не может) ну разве что вот 2 говнистых варианта:
1. Один интерфейс у всех компонентов, соотв. они пораждаются от одного и того же класса и у себя лишь переопределяют какую-то операцию getState();
2. Нужный объект возвращает объект представляющий его внутреннее состояние ("хранитель", простой пример - итератор и current()) и ты работаешь с этим объектом но опять же интерфейс у всех "хранителей" один должен будет быть в твоей системе для логирования.
Но это все костыли, да :)
 
  • Like
Реакции: craz
Сверху