参考 - 此错误在 PHP 中是什么意思?

这是怎麽?

这是一些关于警告,错误和通知的答案,你可能在编程PHP时遇到,不知道如何修复它们。这也是一个社区维基,因此邀请每个人参与添加和维护此列表。

这是为什么呢?

“标头已发送”“调用非对象的成员”等问题在 Stack Overflow 上频繁弹出。这些问题的根本原因总是一样的。因此,这些问题的答案通常会重复它们,然后向OP显示在其特定情况下要更改的行。这些答案不会为网站增加任何价值,因为它们仅适用于OP的特定代码。具有相同错误的其他用户无法轻易从中读取解决方案,因为它们太本地化了。这很可悲,因为一旦你了解了根本原因,修复错误就微不足道了。因此,此列表尝试以一般方式解释解决方案。

我在这里该怎么办?

如果你的问题已被标记为此问题的副本,请在下面找到你的错误消息,并将修复程序应用于你的代码。答案通常包含进一步的链接,以防万一它不应该仅从一般答案中明确。

如果你想做出贡献,请添加你“最喜欢的”错误消息,警告或通知,每个答案一个,一个简短的描述它的含义(即使它只是在他们的手册页中突出显示术语),一个可能的解决方案或调试方法,以及有价值的现有问答列表。此外,请随时改进任何现有答案。

列表

另请参阅:


答案 1

警告:无法修改标头信息 - 标头已发送

当您的脚本尝试将 HTTP 标头发送到客户端但之前已有输出时,会发生此情况,这会导致标头已发送到客户端。

这是一个E_WARNING,它不会停止脚本。

一个典型的例子是这样的模板文件:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

该函数将尝试将带有会话 Cookie 的标头发送到客户端。但是PHP在将元素写入输出流时已经发送了标头。您必须将 移动到顶部。session_start()<html>session_start()

您可以通过在触发警告的代码之前的行中遍历并检查其输出位置来解决此问题。将任何标头发送代码移到该代码之前。

一个经常被忽视的输出是PHP关闭后的新行。当它是文件中的最后一件事时省略它被认为是一种标准做法。同样,此警告的另一个常见原因是当开口前面有一个空格,行或不可见字符时,导致Web服务器发送标头和空格/换行符,因此当PHP开始解析时,将无法提交任何标头。?>?><?php

如果文件中有多个代码块,则它们之间不应有任何空格。(注意:如果您有自动构造的代码,则可能有多个块)<?php ... ?>

还要确保代码中没有任何字节顺序标记,例如,当脚本的编码为 UTF-8 和 BOM 时。

相关问题:


答案 2

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

发生类似于 where 不是对象的代码,因此无法调用。xyz->method()xyzmethod

这是一个致命错误,它将停止脚本(转发兼容性注意:从 PHP 7 开始,它将成为可捕获的错误)。

大多数情况下,这表示代码缺少对错误条件的检查。在调用对象的方法之前,请验证对象是否确实是对象。

一个典型的例子是

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

在上面的示例中,无法准备查询,并将分配给 。然后,尝试调用该方法将导致致命错误,因为是“非对象”,因为该值是布尔值。prepare()false$statementexecute()false

找出函数返回布尔值而不是对象的原因。例如,检查对象中是否发生了最后一个错误。有关如何调试此项的详细信息将取决于如何处理所讨论的特定函数/对象/类的错误。$pdo

如果即使 失败,则数据库句柄对象未传递到当前作用域。找到它的定义位置。然后将其作为参数传递,将其存储为属性,或通过全局作用域共享它。->prepare$pdo

另一个问题可能是有条件地创建一个对象,然后尝试在该条件块之外调用一个方法。例如

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

通过尝试在条件块外部执行方法,可能无法定义对象。

相关问题: