Responder
- Object
- Responder
Une instance de Responder envoie automatiquement des messages de notification à une ou plusieurs instances. Des instances de Responder peuvent être liées afin que les notifications soient automatiquement transmises d'un répondeur à un autre.
MÉTHODES D'INSTANCE
- namespace Responder;
- require_once 'So-o.php';
- defclass('Responder', null, 1, null, array('nextResponders'), null, array('respondTo', 'nextResponders', 'setNextResponders', 'addNextResponder', 'removeNextResponder'));
La classe Responder hérite de la classe Object. La propriété d'instance nextResponders contient la liste des instances qui ont demandé à être notifiées lorsqu'un événement se produit. La classe Responder ajoute les messages d'instance respondTo, nextResponders, setNextResponders, addNextResponder et removeNextResponder.
nextResponders
SYNOPSIS
sendmsg($self, 'nextResponders')
DESCRIPTION
nextResponders
retourne la liste des répondeurs de $self
dans un tableau.
CODE
- function i_nextResponders($self) {
- return sendmsg($self, 'get', 'nextResponders');
- }
setNextResponders
SYNOPSIS
sendmsg($self, 'setNextResponders', $responders)
DESCRIPTION
setNextResponders
initialise la liste des répondeurs de $self
à $responders
.
$responders
est un tableau d'instances.
CODE
- function i_setNextResponders($self, $responders) {
- return sendmsg($self, 'set', 'nextResponders', $responders);
- }
addNextResponder
SYNOPSIS
sendmsg($self, 'addNextResponder', $r)
DESCRIPTION
addNextResponder
ajoute $r
à la liste des répondeurs de $self
.
CODE
- function i_addNextResponder($self, $r) {
- $responders=sendmsg($self, 'get', 'nextResponders');
- if ($responders) {
- if (!in_array($r, $responders)) {
- $responders[]=$r;
- sendmsg($self, 'set', 'nextResponders', $responders);
- }
- }
- else {
- $responders=array($r);
- sendmsg($self, 'set', 'nextResponders', $responders);
- }
- return $self;
- }
removeNextResponder
SYNOPSIS
sendmsg($self, 'removeNextResponder', $r)
DESCRIPTION
removeNextResponder
retire $r
de la liste des répondeurs de $self
.
CODE
- function i_removeNextResponder($self, $r) {
- $responders=sendmsg($self, 'get', 'nextResponders');
- if ($responders) {
- $i=array_search($r, $responders);
- if ($i !== false) {
- unset($responders[$i]);
- sendmsg($self, 'set', 'nextResponders', $responders);
- }
- }
- return $self;
- }
respondTo
SYNOPSIS
sendmsg($self, 'respondTo', $msg[, $arg ...])
DESCRIPTION
Si $self
répond à $msg
, respondTo
envoie $msg
et ses paramètres $arg
à $self
.
Si $self
ne répond pas à msg
ou si l'exécution du message retourne false
, respondTo
transmet le message et ses paramètres à toutes les instances de la liste des répondeurs de $self
.
CODE
- function i_respondTo($self, $msg) {
- if (sendmsg($self, 'respondsTo', $msg) and sendmsg($self, 'perform', $msg, array_slice(func_get_args(), 2))) {
- return $self;
- }
- $responders=sendmsg($self, 'get', 'nextResponders');
- if ($responders) {
- foreach ($responders as $r) {
- sendmsg($r, 'perform', 'respondTo', array_slice(func_get_args(), 1));
- }
- }
- return $self;
- }
EXEMPLE
Une instance de Button notifie le message clicked quand elle reçoit le message click :
- namespace Button;
- require_once 'So-o.php';
- require_once 'Responder.php';
- defclass('Button', $Responder, 1, null, null, null, array('click'));
- function i_click($self) {
- echo $self, ' click', PHP_EOL;
- sendmsg($self, 'respondTo', 'clicked', $self);
- }
click
affiche un message de trace puis notifie le message clicked.
Une instance de Action répond à clicked :
- namespace Action;
- require_once 'So-o.php';
- require_once 'Responder.php';
- defclass('Action', $Responder, 1, null, null, null, array('clicked'));
- function i_clicked($self, $sender) {
- echo $self . ' clicked from ', $sender, PHP_EOL;
- return false;
- }
$ php -a
php > require_once 'Button.php';
php > $btn1=sendmsg($Button, 'new');
php > sendmsg($btn1, 'click');
object(Button) click
Créez une instance de Action et ajoutez-la comme répondeur à l'instance de Button :
php > require_once 'Action.php';
php > $act1=sendmsg($Action, 'new');
php > sendmsg($btn1, 'addNextResponder', $act1);
php > sendmsg($btn1, 'click');
object(Button) click
object(Action) clicked from object(Button)
clicked est automatiquement envoyé par $btn1
à $act1
.
Une instance de AnotherAction répond aussi à clicked
:
- namespace AnotherAction;
- require_once 'So-o.php';
- require_once 'Responder.php';
- defclass('AnotherAction', $Responder, 1, null, null, null, array('clicked'));
- function i_clicked($self, $sender) {
- echo $self . ' clicked from ', $sender, PHP_EOL;
- return true;
- }
Ajoutez une instance de AnotherAction comme répondeur à l'instance de Button :
php > require_once 'AnotherAction.php';
php > $act2=sendmsg($AnotherAction, 'new');
php > sendmsg($btn1, 'addNextResponder', $act2);
php > sendmsg($btn1, 'click');
object(Button) click
object(Action) clicked from object(Button)
object(AnotherAction) clicked from object(Button)
clicked est envoyé par $btn1
à $act1
puis à $act2
.
Des répondeurs peuvent constituer une chaîne :
php > sendmsg($btn1, 'removeNextResponder', $act2);
php > sendmsg($btn1, 'click');
object(Button) click
object(Action) clicked from object(Button)
$btn1
n'a plus que $act1
comme répondeur. Ajoutez $act2
comme répondeur à $act1
:
php > sendmsg($act1, 'addNextResponder', $act2);
php > sendmsg($btn1, 'click');
object(Button) click
object(Action) clicked from object(Button)
object(AnotherAction) clicked from object(Button)
Dans cette configuration, clicked est envoyé au répondeur de $btn1
puis au répondeur de $act1
.
Si un répondeur retourne true
, la chaîne est rompue :
php > sendmsg($act1, 'removeNextResponder', $act2);
php > sendmsg($btn1, 'removeNextResponder', $act1);
php > sendmsg($btn1, 'click');
object(Button) click
php > sendmsg($btn1, 'addNextResponder', $act2);
php > sendmsg($act2, 'addNextResponder', $act1);
php > sendmsg($btn1, 'click');
object(Button) click
object(AnotherAction) clicked from object(Button)
clicked est envoyé par $btn1
à $act2
qui retourne true
et bloque l'envoi du message à $act1
.
Commentaires