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个子类型。因此,您的类型暗示愿望也无法实现。即使在验证数组后,您仍然可以放入其他类型。但是,被拒绝。可能是星星下次会掷更好的骰子。