PHP und callBacks
Grundsätzlich ist es nicht nötig in PHP callBacks einzubinden. Nichts desto trotz gewöhnt man sich schnell an die Handhabung von Javascript – die A-Synchronen AJAX-Calls, das Warten auf andere Objekte, nachladen von Dateien etc. pp. – In PHP sieht das anders aus. Es wird ohnehin jeder Befehl nach und nach aufgerufen. Sollte man einen SQL-Query abfeuern, wartet PHP bis die Daten da sind. Das selbe gilt auch für Socket-Connections oder jede andere Verwendung.
Das heißt natürlich nicht, dass callBacks immer falsch am Platz sind. So kann man diese für die Manipulation von Daten, Fehlerhandhabung oder auch zum Beobachten von Objekten verwenden.
Ein kleines Beispiel soll das erläutern:
abstract class CallBackable { abstract public function callBack(); public function performCallBack() { call_user_func(array($this, 'callBack')); } } class Example extends CallBackable { protected $errorCount = 0; protected $id = null; protected $firstname = null; protected $lastname = null; public function __construct() { } public function setId($id) { if (is_int($id) === false) { $this->performCallBack(); } $this->id = $id; return $this; } public function setFirstname($firstname) { if (is_string($firstname) === false) { $this->performCallBack(); } $this->firstname = $firstname; return $this; } public function setLastname($lastname) { if (is_string($lastname) === false) { $this->performCallBack(); } $this->lastname = $lastname; return $this; } public function callBack() { $this->errorCount++; } public function getErrorCount() { return $this->errorCount; } } $example = new Example(); $example->setId(1) ->setFirstname('Marc') ->setLastname(1337); echo $example->getErrorCount(); // Liefert 1
Javascript wird nie PHP sein und PHP natürlich auch nie Javascript – was auch gut ist. Trotzdem ist die Verwendung von callBacks in PHP kein schlechter Ansatz um einfache Dinge damit abzuhandeln.
Wusstest du schon?
… wie man callBacks in anderen Methoden einbindet und danach noch das Interne Objekt verwenden kann?
class AnotherExample { public function getUserName() { return 'MrBoolean'; } public function execute() { $internalClass = $this; $this->get(function($data) use($internalClass) { echo sprintf($data['test'], $internalClass->getUserName()); }); } public function get($callBack) { $data = array('test' => 'Hello %s!'); $callBack($data); } } $anotherExample = new AnotherExample(); $anotherExample->execute();