necesito para poner en práctica el siguiente patrón en php:La forma correcta de hacer las devoluciones de llamada o delegados 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'));
}
...
}
¿cuál es la forma correcta de hacerlo.
P.S.
Estaba usando call_user_func para ese propósito y créanlo o no, fue capaz de llamar a miembros privados de la clase, pero después de algunas semanas de desarrollo descubrí que dejó de funcionar. ¿Fue un error en mi código o fue alguna otra cosa que me hizo pensar que 'call_user_func' puede llamar a funciones privadas de clase, no sé, pero ahora estoy buscando un método simple, rápido y elegante de seguridad llamar a un miembro privado de la clase de otra clase. Estoy buscando cierres en este momento, pero tengo problemas con '$ this' dentro de cierre ...
'$ this' no es compatible con cierres (como se menciona en el manual) y los miembros privados son privados, ya que el uno, que se los declaró como privados, no quiere que se los llame desde cualquier objeto de una clase diferente. Esta es la definición de "miembro privado";) – KingCrunch
Sí, los miembros privados son privados porque son privados :) Pero imagine que está diciendo su botón 'Oye, ejecute mi código privado en' ButtonClickedHandler 'cuando le hagan clic' . En este caso, no veo por qué el botón debería responder 'Oh, no quiero ejecutar tu código, porque es privado, hazlo público, luego lo haré ...' Pero o bien no veo una razón por la cual debería hacer mi código privado - público ... Espero que entiendas el punto – Lu4
PHP no es .Net. A diferencia de la mantequilla de maní y el chocolate. PHP no tendrá mejor sabor con estas cosas calzadas. Además, cualquiera que venga después de ti probablemente arrojará tu código y lo reconstruirá de una manera sensata. – DampeS8N