La bonne façon de faire des délégués ou des rappels en PHP

J'ai besoin pour mettre en œuvre le schéma suivant en php:

class EventSubscriber
{
private $userCode;
public function __construct(&$userCode) { $this->userCode = &$userCode; }
public function Subscribe($eventHandler) { $userCode[] = $eventHandler; }
}
class Event
{
private $subscriber;
private $userCode = array();
public function __construct()
{
$this->subscriber = new Subscriber($this->userCode)
}
public function Subscriber() { return $this->subscriber; }
public function Fire()
{
foreach ($this->userCode as $eventHandler)
{
/* Here i need to execute $eventHandler  */
}
}
}
class Button
{
private $eventClick;
public function __construct() { $this->eventClick = new Event(); }
public function EventClick() { return $this->eventClick->Subscriber(); }
public function Render()
{
if (/* Button was clicked */) $this->eventClick->Fire();
return '<input type="button" />';
}
}
class Page
{
private $button;
//THIS IS PRIVATE CLASS MEMBER !!!
private function ButtonClickedHandler($sender, $eventArgs)
{
echo "button was clicked";
}
public function __construct()
{
$this->button = new Button();
$this->button->EventClick()->Subscribe(array($this, 'ButtonClickedHandler'));
}
...
}    

quelle est la façon correcte de le faire.

P. S.

J'ai été en utilisant call_user_func à cette fin et croyez-le ou pas, il a été en mesure d'appeler privée membres de la classe, mais après quelques semaines de développement, j'ai trouvé qu'il a cessé de travailler. Était-il un bug dans mon code ou était-ce une autre chose qui m'a fait penser que "call_user_func' appel privé des fonctions de classe, je ne sais pas, mais maintenant, je suis à la recherche d'un moyen simple, rapide et élégant méthode de l'appel en toute sécurité privée d'un membre de la classe de l'autre classe. Je suis à la recherche de fermetures pour l'instant, mais ont des problèmes avec "$this " à l'intérieur fermeture...

$this n'est pas pris en charge par des Fermetures (comme indiqué dans le manuel) et les membres privés sont privés, parce qu'ils la, qui a déclaré comme privés, ne veulent pas être appelés à partir d'un objet d'une classe différente. C'est la définition de "membre privé" 😉
Oui, les membres privés sont privés parce qu'ils sont privés 🙂 Mais imaginez que vous dites à votre bouton " Hey bouton execute mon code confidentiel, dans "ButtonClickedHandler" quand vous serez cliqué sur". Dans ce cas, je ne vois pas pourquoi le bouton doit répondre " Oh, je ne veux pas pour l'exécution de votre code, car il est privé, la rendre publique, alors je vais...", Mais soit je ne vois pas de raison pourquoi devrais-je faire mon code privé - public... Espérons que vous obtenez le point
PHP n'est pas .Net. À la différence de beurre d'arachide et chocolat. PHP ne sera pas meilleur goût avec ces choses entassé. Aussi, toute personne qui vient après vous serez probablement jeter votre code et de le reconstruire tous d'une façon saine.
Acceptez que php n'est pas .net, mais il n'y a rien de mal à avoir une programmation orientée objet wrapper pour php, personne n'a forcé à l'utiliser. Je ne peux pas supporter de spaghettis que php encourage les développeurs à faire.

OriginalL'auteur Lu4 | 2011-01-03