PHP:对成员函数的致命错误调用..在非对象上


PHP: Fatal Error Call to a member function ... on a non-object

我对PHP有一个问题,因为它在标题中不断提到Exception。它在以下线路上失败:

$item->getDescription();

我理解错误的含义($item为空)。但是,$item不为null。

场景如下:这是一个将产品从供应商同步到商店的脚本。为此,我创建了自己的类(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),并且它不是空/null,我怀疑这个错误会停止发生,但它仍然会发生。

还要注意的是,在这一次弹出之前,已经进行了几次产品同步,没有任何错误,所以我知道代码是有效的。不知怎么的,这个特定的案例从我的空支票中溜走了。

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

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

if ($item instanceof SimpleProduct)
{
}

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

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

试着做一个var_dump($item)来确认它在那里,并在代码的其他部分执行它,以确保它不为空。

要检查$item是否为对象,可以使用is_object()

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

使用此:

public function syncProduct($item) {
    var_dump($item);
    if($item InstanceOf SimpleProduct) {
        $foo = $item->getDescription();
    }
    return "Not a product";
}

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

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

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

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

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

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