A promise is a way to defer the execution of a given routine until the data it needs to run is ready. This is a very useful pattern in asynchronous languages, so using promises in a language like javascript is a great idea.
Of course PHP is (without forking) totally synchronous so there is really no reason to implement the promise pattern in PHP.
But the motto of every programmer is “if it’s a bad idea, I will do it!” (no, it isn’t), so here’s an implementation of promises in PHP:
class PromiseClass { private $callbacks = array(); private $last_return; function promise($promise) { if (get_class($promise) == 'Promise') { return $promise; } else if (is_callable($promise)) { $this->then($promise); return $this; } } function then (callable $callback) { $this->callbacks[] = $callback; return $this; } function resolve () { $callback = array_shift($this->callbacks); if (is_callable($callback)) { $this->last_return = $callback($this->last_return); } if (count($this->callbacks) > 0) { $this->resolve(); } } }
A few things to note here:
- First you will have to make an instance of the class.
- You start by passing a function to the
promise
method. You could usethen
but the code wouldn’t look as descriptive or read as well. - You can then add any functions that would be run after with successive calls to
then
. - None of the functions that have been set up will be run until you call the
resolve
method on the object.
Here’s an example of usage of this useless and pointless class:
$promiser = new PromiseClass(); $promiser->promise(function() { echo "sleepingn"; sleep(3); return 3; }) ->then(function($args) { echo "that farn$argsn"; sleep(1); }) ->then(function() { echo "even farthernn"; }); $promiser->resolve();
Note: I’ve added some sleep
statements here so it almost seems like something asynchronous is happening. Really sleep
is just blocking. The output will be something like:
sleeping that far 3 even farther