我对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()方法后,它显示它现在是一个实例,并且对成员函数错误的致命调用消失了。