PHP运行报错Call to a member function saveXML() on bool怎么解决
报错原因
PHP Fatal error: Uncaught Error: Call to a member function saveXML() on bool on line 23.
该报错核心原因是$xml变量为布尔值,并非预期的SimpleXMLElement对象,因此无法调用saveXML()成员方法。
代码遗漏的处理逻辑
当前代码仅校验了curl请求的返回结果是否合法,完全没有处理XML解析环节的异常场景:
simplexml_load_string()函数在遇到内容格式非法、不符合XML规范的字符串时,会返回false,代码未对该函数的返回结果做合法性校验,直接调用成员方法就会触发报错- 现有try-catch逻辑无法捕获该类错误,因为
simplexml_load_string()默认抛出的是PHP警告,不属于Exception异常范畴,写了异常捕获也不会生效
修复方案
可参考以下调整后的代码:
<?php ini_set('display_errors', 'On'); error_reporting(E_ALL); // 开启XML内部错误捕获,避免直接抛出警告 libxml_use_internal_errors(true); $url = "https://urltofeed.com"; $timeout = 1800; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout); try { $response = curl_exec($curl); curl_close($curl); // 校验curl请求结果 if ($response !== false) { $xml = simplexml_load_string($response); // 新增XML解析结果校验 if ($xml !== false) { $xml->saveXML("feed.xml"); } else { // 这里可以自定义XML解析失败的处理逻辑,比如打印错误信息 $errors = libxml_get_errors(); foreach ($errors as $error) { // 处理错误日志逻辑 } libxml_clear_errors(); } } else { // curl请求失败的处理逻辑 } } catch (Exception $ex) { // 全局异常处理 if (gettype($curl) == 'resource') { curl_close($curl); } } echo 'Download XML done'; ?>
内容的提问来源于stack exchange,提问作者JGeer
相关产品推荐
相关产品推荐

