我的视图类中的参数警告无效,为什么


Invalid argument warning in my view class, why?

我得到这个:

警告:在第 21 行的 ''classes''classes.php 中为 foreach() 提供的参数无效

我所有的html都进入$content[]然后我总是先使用setContent,然后渲染它。是什么导致了这种警告,var_dumping $content说它是一个数组,那么为什么这个参数是无效的呢?我应该忽略此警告吗?

class cpage {
    private $title;
    private $content = array();
    public function __construct($title) {
        $this->title = $title;
    }
    public function __destruct() {
    }
    public function setContent($content) {
        $this->content = $content;
    }
    public function render() {
        echo "<H1>{$this->title}</H1>";
    21:         foreach($this->content as $cont){
            echo $cont;
        }
    }
}

您的错误消息指出$this->内容不是数组。在代码中的其他位置将其设置为非数组值。您提供的代码示例没有错误,但是我建议将其放在setContent函数中:

if(!is_array($content)) throw new InvalidArgumentException("Content must be an array");

你也可以使用类型提示来解决这个问题(感谢RainFromHeaven指出它)。

你可以像这样声明函数:

public function setContent(array $content) {
    $this->content = $content;
}

这将导致php生成一个PHP可捕获的致命错误(E_RECOVERABLE_ERROR),如果你试图传递它除了数组之外的任何内容。您可以使用set_error_handler捕获错误。

这些中的任何一个都可以解决您的问题,您使用哪一个主要是个人喜好的问题。通常我更喜欢例外,但我当然可以看到类型提示在这里可能更有意义,因为您很可能不想从错误中恢复。

如果强制 setter 接受数组,则可以跟踪哪个调用方法正在传递无效数据:

public function setContent(array $content) {

这假设$content应该是一个数组 - 如果你想传递要添加到数组中的非数组项,那么该方法可能无论如何都命名错误,应该被称为类似addItemToArray()的东西(以及在内部做一些不同的事情)。