使用Zend为foreach()PHP提供的参数无效

时间:2013-07-26 14:19:01

标签: php html oop foreach

我目前正在使用Zend 1.12开发一个语言模块(之前从未使用过它)并使用以下代码继续获取标题错误。

<?php if(count($this->getContent('languages')) == 0) : ?>
        <tr><td>No languages were found.</td></tr>
    <?php else : ?>
        <?php foreach($this->getContent('languages') as $language) : ?>
    <tr>
        <td><?php echo $language['language_id']; ?></td>
        <td><?php echo $language['name']; ?></td>
        <td><?php echo $language['iso_shortcode']; ?></td>

getContent()方法是这样的:

public function getContent($key) {
    if(isset($this->content[$key])) {
        return $this->content[$key];
    } else {
        return false;
    }
}

一位同事以完全相同的方式完成了一个地址模块,所以我想知道这可能是一个数据库问题吗?我检查了数据库,一切似乎都是对应的。

2 个答案:

答案 0 :(得分:0)

如果指定的键不存在,则getContent()方法返回false;这有很多潜在的问题:

1)如果内容成员变量中的条目的值为false,该怎么办?如果您实际检查结果,则无法区分缺少密钥和找到值为false的密钥。指示缺少条目的更好选择将为null,或者您可以抛出异常。

2)在你使用getContent()时,你已经假设关键'语言'会有结果,但是在没有的情况下无法为防御性的代码编写代码,因为最有可能发生在这里。在调用getContent()之前检查语言键是否更好,将结果分配给变量然后仅在它具有期望值时处理它(例如,在这种情况下不为null或是数组),会更好或者抛出异常。

3)缓解这些问题的一种方法是使用getContent()的默认参数。如果预期的键不存在,则返回默认值,确保调用代码始终有效。在这种情况下,默认值为array()。

4)因为它可能表示一个密钥不存在的错误,所以最后一个好的触摸将是getContent()的第三个参数,它指定密钥是否应该存在,或者是否为默认值默认参数是例如如果传递的默认值为null且未找到密钥,则抛出异常。

答案 1 :(得分:0)

只是为了让您知道如何解决这个问题,或至少解决这个问题:

<?php if(count($this->getContent('languages')) == 0) : ?>
    <tr><td>No languages were found.</td></tr>
<?php else : ?>
    <?php foreach($this->getContent('languages') as $language) : ?>
<tr>
    <td><?php echo $language['language_id']; ?></td>
    <td><?php echo $language['name']; ?></td>
    <td><?php echo $language['iso_shortcode']; ?></td>

你能做什么,就是删除这一行

if(count($this->getContent('languages')) == 0) 

并替换为

if (!$this->getContent('languages'))

这只是检查返回的值是否为false,如果返回的数组为空,则foreach不执行任何操作,这样就不会有问题。或者:

if (!is_array($this->getContent('languages')))

检查返回的值是否不是数组。