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

Php “我的视图”类中的无效参数警告,为什么?,php,class,Php,Class,我明白了: 警告:为第21行\classes\classes.php中的foreach()提供的参数无效 我所有的html都放在$content[]中,然后我总是先使用setContent,然后再渲染它。是什么导致了这个警告,var_dumping$content说它是一个数组,那么为什么这个参数是无效的呢?我应该忽略这个警告吗 class cpage { private $title; private $content = array(); public functi

我明白了:

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

}
class-cpage{
私人产权;
private$content=array();
公共功能构造($title){
$this->title=$title;
}
公共函数_udestruct(){
}
公共函数setContent($content){
$this->content=$content;
}
公共职能{
回显“{$this->title}”;
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\u RECOVERABLE\u error
),如果您尝试传递除数组以外的任何内容。您可以使用set\u error\u处理程序捕获错误


这两种方法中的任何一种都能解决您的问题,您使用哪一种主要取决于个人偏好。通常我更喜欢异常,但我可以肯定类型暗示在这里可能更有意义,因为您很可能不想从错误中恢复。

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

public function setContent(array $content) {

这假设
$content
应该是一个数组-如果您想将非数组项传递到数组中,那么该方法可能命名错误,应该调用类似
addItemToArray()
(以及在内部执行不同的操作).

这是因为您的
$this->content
不是可用于迭代的内容。在循环之前,请使用
var\u dump($this->content)
检查这一点。您可以在函数中设置内容,但您不是为了实际设置而调用函数。您应该在构造中调用setContent函数。@Ahmad,private可以在类中访问。变量首先是一个数组吗?我想暗中试探一下,然后说这个代码:
$this->content=$content应该是:
$this->content[]=$content
。致命错误:无法使用[]在第21行的\classes\classes.php中读取。@Rainfrom天堂非常好的一点-我一直忘记php现在允许这样做。你能给我更多关于类型暗示如何解决这个问题的信息吗?你的
$this->content
最初是一个数组,因此,在
setContent
函数中,它被设置为不好的内容。如果使用类型提示,强制在该函数中提供数组,则在使用错误参数调用该函数时会出现错误。所以你仍然会有一个错误,但现在在你实际拥有模式一的地方有一个。