ho bisogno di implementare il seguente schema in php:Il modo corretto di fare delegati o callback in 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'));
}
...
}
qual è il modo corretto per farlo.
P.S.
Stavo usando call_user_func a tale scopo e credo sia stato in grado di chiamare membri della classe privata, ma dopo alcune settimane di sviluppo ho scoperto che ha smesso di funzionare. È stato un bug nel mio codice o è stato qualcos'altro che mi ha fatto pensare che 'call_user_func' è in grado di chiamare funzioni di classe privata, non lo so, ma ora sto cercando un metodo semplice, veloce ed elegante di sicuro chiamare il proprio membro di classe privato da un'altra classe. Sto cercando di chiudere in questo momento, ma ho problemi con '$ this' all'interno di chiusura ...
'$ this' non è supportata in Chiusure (come indicato nel manuale) e membri privati sono privati, perché l'uno, che li ha dichiarati come privati, non li vogliono essere chiamati da nessun oggetto di una classe diversa. Questa è la definizione di "membro privato";) – KingCrunch
Sì, i membri privati sono privati perché sono privati :) Ma immagina di dire al tuo pulsante 'Ehi, esegui il mio codice privato in "ButtonClickedHandler" quando clicchi' . In questo caso non vedo perché il pulsante dovrebbe rispondere "Oh, non voglio eseguire il tuo codice, perché è privato, renderlo pubblico, poi lo farò ..." Ma o non vedo un motivo per cui dovrei rendere il mio codice privato - pubblico ... Spero che tu ottenga il punto – Lu4
PHP non è .Net. A differenza del burro di arachidi e del cioccolato. PHP non ha un sapore migliore con queste cose calzante in esso. Inoltre, chiunque si presenti dopo aver probabilmente buttato fuori il tuo codice e ricostruito tutto in modo sensato. – DampeS8N