<h3>致命错误:调用成员函数。。。在非对象上</h3>
<p>与<code>xyz->method()</code>类似的代码发生,其中<code>xyz</code>不是对象,因此无法调用<code>method</code>。</p>
<p>这是一个致命错误,将停止脚本(转发兼容性注意:从PHP 7开始,它将成为一个可捕获的错误)。</p>
<p>通常这是代码缺少错误条件检查的迹象。在调用对象的方法之前,请验证该对象实际上是一个对象。</p>
<p>一个<a href="https://stackoverflow.com/search?q=%5Bphp%5D+%5Bpdo%5D+Fatal+error%3A+Call+to+a+member+function+on+a+non-object">typical</a>的例子是</p>
<pre><code>// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
</code></pre>
<p>在上面的示例中,无法准备查询,<code>prepare()</code>将把<code>false</code>分配给<code>$statement</code>。尝试调用<code>execute()</code>方法将导致致命错误,因为<code>false</code>是“非对象”,因为该值是布尔值。</p>
<p>找出<em>为什么</em>函数返回的是布尔值而不是对象。例如,检查<code>$pdo</code>对象以查找最后发生的错误。有关如何调试的详细信息将取决于如何处理有关特定函数/对象/类的错误。</p>
<p>如果连<code>->prepare</code>都失败了,那么<code>$pdo</code>数据库句柄对象<a href="https://stackoverflow.com/questions/4910796/scope-error-call-to-a-member-function-prepare-on-a-non-object">didn't get passed into the current scope</a>。找到它的定义。然后将其作为参数传递、存储为属性或通过全局范围共享。</p>
<p>另一个问题可能是有条件地创建一个对象,然后试图在该条件块之外调用一个方法。例如</p>
<pre><code>if ($someCondition) {
$myObj = new MyObj();
}
// ...
$myObj->someMethod();
</code></pre>
<p>如果试图在条件块外执行方法,则可能无法定义对象。</p>
<p>相关问题:</p>
<ul>
<li><a href="https://stackoverflow.com/q/54566/727208">Call to a member function on a non-object</a></li>
<li><a href="https://stackoverflow.com/search?q=%5Bphp%5D+Fatal+error%3A+Call+to+a+member+function+on+a+non-object">List all PHP "Fatal error: Call to a member function ... on a non-object" Questions on Stackoverflow</a></li>
</ul>