несколько обработчиков события компонента

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
cyberovskij
Сообщения: 6
Зарегистрирован: 2013.11.17, 12:22

несколько обработчиков события компонента

Сообщение cyberovskij »

Здравствуйте.
Начал разбираться с yii. На странице с документацией http://yiiframework.ru/doc/guide/ru/basics.component прочел такое:"Событию могут быть назначены несколько обработчиков. При возникновении события обработчики будут вызваны в порядке их назначения." Объясните пожалуйста какой механизм такого присвоения. То есть как получается, что если обычной переменной присваивается значение, то это значение заменяет предыдущее. Но в случае с событиями значения добавляются в массив? Я понимаю, что скорее всего мне не хватает знаний по php, но что то информации по этому вопросу не смог найти.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: несколько обработчиков события компонента

Сообщение Nafania »

Да, события это фактически массив.
При возникновении события обработчики вызываются по очереди.
deblogger
Сообщения: 83
Зарегистрирован: 2013.11.09, 15:12

Re: несколько обработчиков события компонента

Сообщение deblogger »

Из мануала ничего не понял. В сырце все написано по-человечески:

Вот так добавляются обработчики.
* Inserts an item at the specified position.
* Original item at the position and the next items
* will be moved one step towards the end.
Действующее вещество:

Код: Выделить всё

array_splice($this->_d,$index,0,array($item)); 
Это в Clist. Который extends CComponent в который Clist и добавляется. Так строится дерево.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: несколько обработчиков события компонента

Сообщение ElisDN »

cyberovskij писал(а):...если обычной переменной присваивается значение, то это значение заменяет предыдущее.
Это если обычной переменной. В самом классе такой переменной нет. Срабатывает магический метод __set.

Попробуйте создать класс:

Код: Выделить всё

class Man {
    public function __set($name, $value) {
        echo 'Я метод __set, вызванный с $name=' . $name . ' и $value=' . $value;
    }
} 
и присвоить какое-то значение любой вымышленной переменной:

Код: Выделить всё

$man = new Man();
$man->age = 18; 
На экране появится строка:

Код: Выделить всё

Я метод __set, вызванный с $name=age и $value=18
То есть при как бы обычном присваивании происходит вызов метода. При чтении несуществующего свойства аналогично вызывается метод __get.

Доработаем класс:

Код: Выделить всё

class Man
{
    public $values = array();

    public function __set($name, $value) {
        $this->values[$name][] = $value
    }

    public function __get($name) {
        return $this->values[$name];
    }
} 
Теперь попробуем несколько раз присвоить:

Код: Выделить всё

$man = new Man();
$man->woman = 'Маша';
$man->woman = 'Катя';
$man->woman = 'Кристина'; 
и вывести на экран:

Код: Выделить всё

print_r($man->woman); 
и вместо одного значения мы получим массив :)

То же самое происходит и в аналогичном методе компонентов в Yii для всех таких якобы переменных, начинающихся с on*. Только вместо обычного массива создаётся более продвинутый список CList.

Ну и в копилку по событиям рекомендую ещё одну статью.
deblogger
Сообщения: 83
Зарегистрирован: 2013.11.09, 15:12

Re: несколько обработчиков события компонента

Сообщение deblogger »

Да, и обязательно следует добавить что под событиями подразумевается возникновение условий, а вовсе не прерывания по событию, типа, как в примере onClick().

Или на php уже пишут MDI апликухи?
cyberovskij
Сообщения: 6
Зарегистрирован: 2013.11.17, 12:22

Re: несколько обработчиков события компонента

Сообщение cyberovskij »

Спасибо всем, кто отписался особенно ElisDN за объяснение на пальцах.
Ответить