Пример:
У меня в системе есть разные сущности (например, категория и товар) и у меня есть необходимость отправлять их в другую систему. Сам метод отправки можно реализовать хоть на статических методах, хоть на функциях, хоть с объектами, хоть без - это, действительно не сильно важно. А вот для сущностей удобны объекты:
1 мы Создаем либо базовый абстрактный класс, либо интерфейс entity, в котором говорим, что обязательно у сущности должен быть метод toExport() или ExportTo($param) - зависит от нюансов, но роли не играет
2 Все наши сущности мы наследуем от этого абстрактного класса, либо имплементим интерфейс - другими словами говорим о том, что метод, как и обещано, мы реализовали. Таким образом у нас есть 2 класса: category, product которые точно реализовали метод toExport()
3 Реализуем экспортер во внешнюю систему (или несколько, если экспортеров несколько), у которого всего 1 функция export(entity $entityToExport)
Все, у вас есть несколько классов каждый делает свою маленькую часть работы. Как это выглядит в коде:
PHP:
скопировать код в буфер обмена
abstract class entity { /** * используется при экспорте сущностей во внешние системы * * @abstract * @return string */ public abstract function toExport(); /** * используется при экспорте сущностей во внешние системы * * @abstract * @return int|string */ public abstract function getUniqueKey(); /** * Принимает на вход список фссоциативных массивов с данными о сущности, * возвращает список сущностей (сущности - это те унаследованные классы, из * которых вызывается метод) * * @static * @param array $data * @return entity[] */ public static function getListFromArray($data){ $className = get_called_class(); foreach($data as $val){ $return[] = new $className($val); } return $return; } } class CategoryEntity extends entity { /** @var int */ private $id = 0; /** @var string */ private $name = ''; public function __construct ($data=array()){ return; } } public function toExport(){ 'id' => (int)$this->id, 'name' => (string)$this->name, ); } } $client = ServiceMixHttpClient::getInstance(); $client->send($model->getById((int)$category['id']));
|