All streams
Search
Write a publication
Pull to refresh
123
0
Михаил Стадник @Mikhus

Software Engineer

Send message
Спасибо, ошибочку в окошке исправил. Остальное будем пробовать воспроизводить и исправлять.
А вы рассматривайте потерю 10% денег — как инвестиции в будущее
Любая программа к моменту ее написания является безнадежно устаревшей ;)
Не согласен:

class Mixin1 {
    public function doSomething1() { echo "1\n"; }
}

class Mixin2 {
    public function doSomething2() { echo "2\n"; }
    public static function doStatic() { echo "static\n"; }
}

class Aggregator {
    private $mixins = array();
    private static $staticMixins = array();

    function __construct() {
        $this->mixins[] = new Mixin1();
        $this->mixins[] = new Mixin2();
        self::$staticMixins[] = 'Mixin2';
    }

    public function __call( $method, $params ) {
        $result = null;
        for( $q = 0; $q < count($this->mixins); $q++ )
        {
            if( method_exists( $this->mixins[$q], $method ) )
            {
                 // находим первого делегата, отдаем ему полномочия и завершаем выполнение метода
                 $result = call_user_func_array( array( $this->mixins[$q], $method), $params );
                 break;
            }
        }
        return $result;
    }

    public static function __callStatic( $method, $params) {
    	$result = null;
    	for ($i = 0, $s = sizeof( self::$staticMixins); $i < $s; $i++) {
    		$class = self::$staticMixins[$i];
    		if (method_exists( $class, $method)) {
    			$result = call_user_func_array(
    				array( $class, $method),
    				$params
    			);
                break;
    		}
    	}
    	return $result;
    }
}

$a = new Aggregator();
$a->doSomething1();
$a->doSomething2();
Aggregator::doStatic();


хотя вызов статических методов вообще фича абсолютно лишняя. Разницы между

Aggregator::doStatic() и Mixin2::doStatic() нет. Просто лишний воркараунд абсолютно никому не нужный.
Полностью согласен с 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» вдвойне неоправданна и проблематична… ИМХО.
I'm lucky ;) с автоматическим выбором Chrome
Да, я ее получил после того как хотел добавить дневное меню в расписании на текущую неделю, где выбрал добавить рецепт в категорию Мясные блюда / Говядина. А получил страницу 404. Придется голодать в этот день однако :)))
После регистрации вылазит:

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
Меня более интересует компонент в котором иерархия по сути не глубокая. А вот наботы данных разные на разных уровнях (кол-во колонок и их содержание). При этом глубина может отличаться в зависимости от условий (конфигурации). И необходимость иметь возможность фильтровать/сортировать группировать каждый уровень по отдельности. Классические деревья с этим не справляются. Простейший вариант — вложение гридов. Именно поэтому появился этот топик. А за линки — большое спасибо — информация полезная.
о! а я его как-то сразу не заметил :)
Офигительные плагины. Кинул себе в закладки. А можно у них задать разные дефинишины для колонок и полей на разных уровнях (количественно и по содержанию)?
Некоторые вещи хороши лишь в разумных пределах :) Ну а тут уж ваше право, если нравится — можете именно так и использовать.
Спасибо, уже исправил :)

Information

Rating
Does not participate
Location
Киев, Киевская обл., Украина
Date of birth
Registered
Activity