4

我遇到了 PHP 的问题,因为它一直在标题中提到异常。它在以下行失败:

$item->getDescription();

我理解错误应该是什么意思($item为空)。但是,$item 不为空。

场景如下: 这是一个将产品从供应商同步到商店的脚本。为此,我创建了自己的类(SimpleProduct)。这个类有一个 getDescription() 函数。

问题是我收到的数据往往有很多垃圾,比如尚未填写的项目。脚本应该跳过这些项目并继续迭代其余产品。这个致命错误会杀死整个脚本。

我已经尝试过实施安全措施来防止这种情况发生,但它仍然经常发生。这是当前代码(删除了一些片段,因为它们与当前案例无关)。

//This is part of a class that performs the sync

public function syncProduct($item) {

    if(empty($item)) { return "Not a product"; }
         else { var_dump($item) }

    $foo = $item->getDescription();
}

检查 var_dump 结果时,我得到一个填充了一些值的对象。看到它是正确的类型(SimpleProduct)并且它不是空/空,我会怀疑这个错误停止发生,但它仍然存在。

另请注意,在弹出此产品之前,已经发生了几次产品同步而没有任何错误,因此我知道代码是有效的。不知何故,这个特定的案例滑过了我的空检查。

我的空检查有问题吗?当有问题的对象确实存在时,如何抛出非对象的错误?

4

5 回答 5

8

与其检查变量是否为空,不如检查它是否是SimpleProduct?

if ($item instanceof SimpleProduct)
{

}

http://php.net/manual/en/language.operators.type.php

于 2012-08-06T09:35:06.203 回答
0

检查 $item 是否是一个对象你可以使用is_object()

于 2012-08-06T09:35:58.603 回答
0

您的 null 检查不会阻止使用该对象,即使它为 null包含非对象。

用这个:

public function syncProduct($item) {
    var_dump($item);

    if($item InstanceOf SimpleProduct) {
        $foo = $item->getDescription();
    }

    return "Not a product";
}

我站纠正!我没有注意到退货声明。发生这种情况的另一种情况是,如果 from 的值$item不是空的,但也不是产品 - 很可能是标量或数组,因为将对象用作其他类型的对象会在找不到方法方面产生不同的错误。

于 2012-08-06T09:29:23.103 回答
0

在运行此之后,我也遇到了类似的问题:

$user = DB::getInstance()->action($action="SELECT * ", 'users');

然后检查 $user 是否是数据库的实例,我发现它不是。然后我决定将其分开如下:

$user = DB::getInstance();
$user->action($action="SELECT * ", 'users');

完成此操作并使用 instanceof() 方法后,它显示它现在是一个实例,并且对成员函数的致命调用错误消失了。

于 2014-06-20T06:47:55.943 回答
0

当然,该对象在函数 syncProduct 的上下文中仍然不可用。

尝试做一个 var_dump($item) 来确认它的存在并在代码的 else 部分执行它以确保它不为空。

于 2012-08-06T09:32:54.973 回答