这个实现是PHP中Promise的公平示例吗?

Dar*_*ous 12 php promise

我一直在阅读有关Promise模式的内容,我尝试使用一些示例和我自己对它应该如何工作的理解来在PHP中编写一个版本.我想出了Promise模式的合理示例,还是我错误地实现了这个?

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;
        }
    }
    public function then (callable $callback) {
        $this->callbacks[] = $callback;
        return $this;
    }
    public 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

$promiser->promise(function() {
        echo "sleeping\n";
        sleep(3);
        return 3;
    })
    ->then(function($args) {
        echo " in second function, $args\n";
    });
$promiser->resolve();
Run Code Online (Sandbox Code Playgroud)

Séb*_*uld 18

你的Promise实现大多是正确的.然而,有一个问题:至少在PHP中,它几乎是无用的,几乎完全等同于Observer模式wikipedia msdn oodesign.

PHP几乎完全是单线程的.sleep也不例外.因此,您的整个Promise将阻止您的脚本,直到它完成.因此,看到操作是内联执行的,您可能也不会打扰.

摆脱这个小问题的一种可能方法是让你的Promise从主脚本派生,这可以使用PCNTL系列函数.这将允许Promise代码在后台运行,而主脚本继续.当Promise完成时,它会回来.

http://www.php.net/manual/en/function.pcntl-fork.php#98711概述了实现此目的的方法.它主动使用pcntl_fork,允许你分叉一个新线程.它有缺点 - 其中最大的缺点是除了信号外无法通过任何信息向主进程发送信息.

  • 如果你想做[合作多任务处理](http://en.wikipedia.org/wiki/Computer_multitasking#Cooperative_multitasking),也会通过同步发生回调地狱.顺便说一句,如果你有PHP 5.5,最好使用[发电机](http://www.php.net/manual/en/language.generators.php)(自2013年6月20日起)而不是承诺......哦和ofc你可以在php中使用[pthreads扩展名](http://pthreads.org/)(自2012年起)......所以这个答案"大多没用"...... (4认同)
  • 在这个 Web 服务时代,对不同服务器进行 HTTP 调用是一个非常常见的用例。[`curl_multi_init`](https://www.php.net/manual/en/function.curl-multi-init.php) 是任何 PHP 标准版本中内置的一项功能,允许异步 HTTP 调用。Promise 是封装此类异步行为的一种相当优雅的方式,而这正是流行的 PHP HTTP 库(如 Guzzle)正在做的事情。因此,即使仅使用标准单线程版本的 PHP,Promise 在 PHP 中也确实具有有价值的用例; (2认同)