【问题标题】:Type hinting content of an array数组的类型提示内容
【发布时间】:2014-08-08 20:27:13
【问题描述】:

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

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

传入的数组应该只包含实现IRule 接口的对象,但是由于我无法输入提示数组的内容,我想知道是否有其他方法可以做到这一点?

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

【问题讨论】:

  • 如何更改方法签名以采用 RuleList 对象,该对象只需要实现 IRule 的对象
  • 在 PHP 中,数组类型不能指定为仅 1 个子类型。所以你的打字愿望也不能完成。即使在验证了您的数组之后,您仍然可以放入其他类型。
  • arrayof RFC,但是被拒绝了。可能是明星下次会掷出更好的骰子。

标签: php arrays type-hinting


【解决方案1】:

在函数头中是不可能的,但你可以稍后进行instanceof检查。

例子:

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

【讨论】:

    【解决方案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中有很多好东西,看看吧:)

    【讨论】:

    • 好主意!但是你必须重构你的代码并改变每一次出现的规则数组。
    • foreach 和您的解决方案在功能上有什么区别?
    • 我的更快,因为迭代器可以实现为只保存IRule 对象,您不必担心元素。它在 OOP 范围内也更简洁。
    • public function add(IRule $element) { 例如。
    猜你喜欢
    • 2021-11-10
    • 2015-11-10
    • 2021-02-17
    • 2015-05-23
    • 2021-06-13
    • 2019-09-08
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多