Полностью согласен с tenshi. Вы лукавите говоря о неудобстве в предыдущем примере:
class A {
public function aa() {
echo __METHOD__ . " called!\n";
}
}
class B {
public function bb() {
echo __METHOD__ . " called!\n";
}
}
class AggregateDelegate {
protected $_objects = array();
public function __construct() {
$args = func_get_args();
for ($i = 0, $s = sizeof( $args); $i < $s; $i++) {
if (!is_object( $args[$i])) {
throw new Exception( 'Invalid argument!');
}
$this->_objects[] = $args[$i];
}
}
public function __call( $name, $args) {
if (!method_exists( $this, $name)) {
for ($i = 0, $object; $object = $this->_objects[$i]; $i++) {
if (method_exists( $object, $name)) {
return call_user_func_array(
array( $object, $name),
$args
);
}
}
}
}
}
class C extends AggregateDelegate {
public function cc() {
echo __METHOD__ . " called!\n";
}
}
$c = new C( new A(), new B());
$c->aa();
$c->bb();
$c->cc();
А можно и так:
class C extends AggregateDelegate {
public function __construct() {
parent::__construct( new A, new B);
}
public function cc() {
echo __METHOD__ . " called!\n";
}
}
$c = new C;
$c->aa();
$c->bb();
$c->cc();
В конкретной реализации возможно следует продумать как разруливать последовательности объектов и их methods overloading, но для примера и так сгодится.
При этом откуда взялись A и B нас мало волнует. Ибо, как правило, такое может быть нужно именно тогда, когда A и B — 3'd-party (из понятных соображений). А там где «все мое» ваша эмуляция «mixins» вдвойне неоправданна и проблематична… ИМХО.
Да, я ее получил после того как хотел добавить дневное меню в расписании на текущую неделю, где выбрал добавить рецепт в категорию Мясные блюда / Говядина. А получил страницу 404. Придется голодать в этот день однако :)))
Меня более интересует компонент в котором иерархия по сути не глубокая. А вот наботы данных разные на разных уровнях (кол-во колонок и их содержание). При этом глубина может отличаться в зависимости от условий (конфигурации). И необходимость иметь возможность фильтровать/сортировать группировать каждый уровень по отдельности. Классические деревья с этим не справляются. Простейший вариант — вложение гридов. Именно поэтому появился этот топик. А за линки — большое спасибо — информация полезная.
Офигительные плагины. Кинул себе в закладки. А можно у них задать разные дефинишины для колонок и полей на разных уровнях (количественно и по содержанию)?
хотя вызов статических методов вообще фича абсолютно лишняя. Разницы между
Aggregator::doStatic() и Mixin2::doStatic() нет. Просто лишний воркараунд абсолютно никому не нужный.
А можно и так:
В конкретной реализации возможно следует продумать как разруливать последовательности объектов и их methods overloading, но для примера и так сгодится.
При этом откуда взялись A и B нас мало волнует. Ибо, как правило, такое может быть нужно именно тогда, когда A и B — 3'd-party (из понятных соображений). А там где «все мое» ваша эмуляция «mixins» вдвойне неоправданна и проблематична… ИМХО.
Notice: Undefined property: Site::$user_id in /home/chefonline.ru/www/modules/home/views.php on line 70
Notice: Undefined property: Site::$user_id in /home/chefonline.ru/www/modules/home/views.php on line 93
Notice: Undefined property: Site::$user_id in /home/chefonline.ru/www/modules/home/views.php on line 100