Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 类型暗示数组的内容_Php_Arrays_Type Hinting - Fatal编程技术网

Php 类型暗示数组的内容

Php 类型暗示数组的内容,php,arrays,type-hinting,Php,Arrays,Type Hinting,我有一个方法,它接受一系列规则作为参数 public function setRule($name, Array $rules) { ... } 传入的数组应该只包含实现IRule接口的对象,但是由于我不能键入数组的内容,我想知道是否有其他方法可以这样做 我非常感谢您提供答案的示例。这在函数标题中是不可能的,但您可以稍后进行instanceof检查 例如: foreach ($rules as $r) { if ($r instanceof IRule) { do_somethin

我有一个方法,它接受一系列规则作为参数

public function setRule($name, Array $rules) { ... }
传入的数组应该只包含实现IRule接口的对象,但是由于我不能键入数组的内容,我想知道是否有其他方法可以这样做


我非常感谢您提供答案的示例。

这在函数标题中是不可能的,但您可以稍后进行instanceof检查

例如:

foreach ($rules as $r) {
  if ($r instanceof IRule) {
    do_something();
  } else {
    raise_error();
  }
}

这在函数头中是不可能的,但您可以稍后执行instanceof检查

例如:

foreach ($rules as $r) {
  if ($r instanceof IRule) {
    do_something();
  } else {
    raise_error();
  }
}

现在大多数人都会建议在方法内部时检查数组,但最好尝试这种方法

实现一个类似于数组的类,例如foreach,并将此迭代器传递给类:

class IRuleIterator implements Iterator {
    private $var = array();

    public function __construct($array) {
        if (is_array($array)) {
            $this->var = $array;
        }
    }

    public function add($element) {
        $this->var[] = $element;
        return $this;
    }

    public function rewind() {
        reset($this->var);
        return $this;
    }

    public function current() {
        return current($this->var);
    }

    public function key() {
        return key($this->var);
    }

    public function next() {
        return next($this->var);
    }

    public function valid() {
        return ($this->current() instanceof IRule);
    }
}
那么你的功能是:

public function setRule($name, IRuleIterator $rules) { /* ... */ }
您可以在这里找到可以实现的特殊PHP对象的完整列表:


ArrayIterator更适合您的用途。SPL中有很多不错的东西,看看吧:

现在大多数人都会建议在方法中检查数组,但最好这样做

实现一个类似于数组的类,例如foreach,并将此迭代器传递给类:

class IRuleIterator implements Iterator {
    private $var = array();

    public function __construct($array) {
        if (is_array($array)) {
            $this->var = $array;
        }
    }

    public function add($element) {
        $this->var[] = $element;
        return $this;
    }

    public function rewind() {
        reset($this->var);
        return $this;
    }

    public function current() {
        return current($this->var);
    }

    public function key() {
        return key($this->var);
    }

    public function next() {
        return next($this->var);
    }

    public function valid() {
        return ($this->current() instanceof IRule);
    }
}
那么你的功能是:

public function setRule($name, IRuleIterator $rules) { /* ... */ }
您可以在这里找到可以实现的特殊PHP对象的完整列表:


ArrayIterator更适合您的用途。SPL中有很多好东西,看看吧:

好主意!但是您必须重构代码并更改规则数组的每次出现。foreach和您的解决方案在功能上有什么区别?我的更快,因为迭代器可以实现为只保存IRule对象,并且您不必担心元素。它在OOP scope.public函数addIRule$元素中也更干净{例如,好主意!但是您必须重构代码并更改规则数组的每次出现。foreach和您的解决方案在功能上有什么区别?我的更快,因为迭代器可以实现为只保存IRule对象,并且您不必担心元素。它在OOP范围内也更干净.public function addire$元素{例如,如何更改方法签名以获取RuleList对象,该对象只要求实现IRuleIn PHP数组类型的对象不能被指定为仅1个子类型。因此,您的类型暗示愿望也无法实现。即使在验证数组后,您仍然可以放入其他类型。有,但是被拒绝。可能是stars下一次将掷更好的骰子。如何更改方法签名以获得RuleList对象,该对象只要求实现IRuleIn PHP数组类型的对象不能被指定为仅1个子类型。因此,您的类型暗示愿望也无法实现。即使在验证数组后,您仍然可以放入其他类型。但是,被拒绝。可能是星星下次会掷更好的骰子。