键入数组的提示内容

时间:2014-06-18 13:46:30

标签: php arrays type-hinting

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

public function setRule($name, Array $rules) { ... }

传入的数组应该只包含实现IRule接口的对象,但是由于我无法键入提示数组的内容,我想知道是否有另一种方式做到了吗?

我非常感谢您回答的例子。

2 个答案:

答案 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中有很多好东西,请看一下:)