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

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

问题描述:

我得到这个:我的视图类中的参数警告无效,为什么?

Warning: Invalid argument supplied for foreach() in \classes\classes.php on line 21

我所有的HTML进去$content[]然后我一直使用setContent第一解析它。什么导致这个warrning,var_dumping $内容说它的一个数组,为什么这个参数是无效的?我应该忽略这个警告吗?

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; 
     } 
    } 

} 
+1

这是因为你的'$ this-> content'不是什么东西,可用于迭代。在循环之前用'var_dump($ this-> content)'检查这个' –

+0

你有一个函数中的内容设置,但是你没有调用函数来实际设置它。你应该在你的构造中调用setContent函数。 – Karl

+0

@Ahmad,私人可在课堂内使用。变量是否是一个数组? –

您的错误消息说$ this-> content不是数组。您将其设置为代码中其他位置的非数组值。您提供的代码示例没有错误,但是我建议把这个在你的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捕获错误。

其中任何一种都可以解决您的问题,并且您使用的是个人偏好问题。通常我更喜欢异常,但我可以肯定地看到类型暗示在这里可能更有意义,因为您很可能不想从错误中恢复。

+0

或使用类型提示... – Mark

+0

@RainFromHeaven非常好的一点 - 我一直忘记,PHP现在允许。 – Benubird

+0

它已经这么做了很长时间;) – Mark

如果强行制定者接受一个数组,你可以跟踪其调用方法传递无效数据:

public function setContent(array $content) { 

这假定$content应该是一个数组 - 如果你想通过非数组项为增加了到一个数组,然后该方法可能会被错误命名,应该被称为addItemToArray()(以及在内部做一些不同的事情)。