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

PHP是否有一种简洁的方法来创建一个;惰性数组";?,php,arrays,Php,Arrays,我想要一个简洁的方法来做这样的事情 $this->requireAllConditionsAreTruthy([ function() { return $this->clan }, function() { return $this->team }, function() { return $this->memberToAdd }, function() { return $this->section }, function

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

$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有没有一种简洁的方法来定义一个延迟计算数组?

看起来最直接的解决方案是生成每个表达式,并将该方法视为生成器。使用
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;
        }
     }
 }
这将使授权验证保持在最低限度,同时仍然提供关于哪个条件失败的更精确反馈,以用于调试或一般日志记录目的。

我不知道“简洁”在某些圈子中是否有特定含义,但对于这种情况,它感觉不太合适。您基本上需要某种“短路”机制,类似于
如果($this->clan&&$this->clan->hasTeamForSection)
在计算第二个位之前会停止,因为第一个位是假的,是这样吗?这是否存在于您知道的另一种语言中?