0

我明白了:

警告:在第 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;
        }
    }

}
4

2 回答 2

1

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

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

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

您可以像这样声明函数:

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

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

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

于 2013-10-21T08:37:34.903 回答
1

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

public function setContent(array $content) {

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

于 2013-10-21T09:02:59.407 回答