我有一个接受一系列规则作为参数的方法。
public function setRule($name, Array $rules) { ... }
传入的数组应该只包含实现IRule
接口的对象,但是由于我无法键入提示数组的内容,我想知道是否有另一种方式做到了吗?
我非常感谢您回答的例子。
答案 0 :(得分:2)
在函数标题中是不可能的,但您可以稍后进行instanceof
检查。
示例:
foreach ($rules as $r) {
if ($r instanceof IRule) {
do_something();
} else {
raise_error();
}
}
答案 1 :(得分:2)
现在大多数人都会建议您在方法内部时检查数组,但最好以这种方式尝试;
实现Iterator(这是一个可以像数组一样使用的类,例如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对象”的完整列表:http://php.net/manual/en/book.spl.php
ArrayIterator
对你的目的来说会更好。 SPL中有很多好东西,请看一下:)