PHP是否有简洁的方法来创建一个"懒惰数组"?

时间:2015-11-19 10:23:02

标签: php arrays

我想要一种简洁的方法来做这样的事情。

$this->requireAllConditionsAreTruthy([
    function() { return $this->clan },
    function() { return $this->team },
    function() { return $this->memberToAdd },
    function() { return $this->section },
    function() { return $this->clan->hasTeamForSection($this->section) },
    function() { return $this->memberToAdd->isInClan($this->clan) },
    function() { return ! $this->team->hasMember($this->memberToAdd) },
    function() { return ! $this->memberToAdd->isOnTeamForSection($this->section) }
]);

目的是如果$this->clan之类的东西被证明是假的,我希望能够在调用$this->clan->hasTeamForSection之前抛出异常并记录哪个条件失败并退出数组迭代。

PHP是否有简洁的方法来定义延迟评估的数组?

1 个答案:

答案 0 :(得分:0)

看起来最直接的解决方案是产生每个表达式并将方法视为生成器。使用yield,每个表达式只有在循环时才会进行延迟计算。

public function authorization() {

    yield $this->clan;
    yield $this->team;
    yield $this->memberToAdd;
    yield $this->section;
    yield $this->clan->hasTeamForSection($this->section);
    yield $this->memberToAdd->isInClan($this->clan);
    yield  ! $this->team->hasMember($this->memberToAdd);
    yield  ! $this->memberToAdd->isOnTeamForSection($this->section);
}

然后为了处理授权,我可以这样做:

public function authorize() {

    foreach ($this->authorization() as $key => $condition) {

        if (!$condition) {
           Log::debug(sprintf("Authorization condition %s failed in %s", $key, get_class($this));
           throw new AuthorizationException;
        }
     }
 }

这将使授权验证保持最小,同时仍然提供有关哪些条件失败的更准确的反馈,用于调试或一般日志记录。