这是您在编写PHP时可能遇到的警告,错误和注意事项的一些答案,并且您不知道如何修复它们。 这也是一个社区Wiki,所以每个人都被邀请加入和维护这个列表。
堆栈溢出时经常会弹出“已经发送了报头”或“调用非对象的成员”之类的问题。 这些问题的根源总是一样的。 因此,这些问题的答案通常会重复它们,然后向OP显示在它们的特定情况下要更改的行。 这些答案不会给站点增加任何价值,因为它们只适用于OP的特定代码。 具有相同错误的其他用户无法轻松地从中读取解决方案,因为他们太本地化了。 这是可悲的,因为一旦您理解了根本原因,修复错误就变得微不足道了。 因此,本列表试图以一种通用的方式来解释解决方案。
如果您的问题被标记为此问题的重复,请在下面找到您的错误消息,并将修复程序应用到您的代码中。 答案通常包含进一步的链接来调查,以防仅仅从一般答案就不清楚。
如果您想贡献,请添加您“最喜欢的”错误信息,警告或通知,每个答案一个,简短的说明它的含义(即使只是在手册页上突出显示术语),可能的解决方案或调试方法,以及现有的有价值的Q&a列表。 另外,请随时改进现有的答案。
另请参见:
当您的脚本试图向客户端发送HTTP报头,但之前已经有了输出,这导致报头已经发送到客户端时,就会发生这种情况。
这是一个e_warning
,它不会停止脚本。
一个典型的例子是这样的模板文件:
<html>
<?php session_start(); ?>
<head><title>My Page</title>
</html>
...
session_start()
函数将尝试将带有会话cookie的头发送到客户端。 但是PHP在将元素写入输出流时已经发送了头。 您必须将
session_start()
移到顶部。
您可以通过遍历触发警告的代码之前的行并检查其输出的位置来解决这个问题。 将发送代码的任何头移动到该代码之前。
一个经常被忽略的输出是PHP结束?>
后的新行。 当?>
是文件中的最后一个内容时,省略它被认为是一种标准做法。 同样,出现此警告的另一个常见原因是,当开头的前面有一个空的空格,行或不可见的字符时,导致web服务器发送标头和空格/换行,因此当PHP开始解析时,将无法提交任何标头。
如果您的文件中有多个代码块,那么它们之间不应该有任何空格。 (注意:如果您有自动构造的代码,则可能有多个块。)
还要确保您的代码中没有任何字节顺序标记,例如当脚本的编码是带有BOM的UTF-8时。
相关问题:
发生在类似于xyz->method()
的代码中,其中xyz
不是对象,因此不能调用该方法
。
这是一个致命的错误,它将停止脚本(前向兼容性注意:从PHP 7开始,它将成为一个可捕获的错误)。
通常情况下,这表明代码缺少对错误条件的检查。 在调用一个对象的方法之前,验证该对象是否实际上是一个对象。
一个典型的例子是
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
在上面的示例中,查询无法准备,prepare()
将把false
分配给$statement
。 尝试调用execute()
方法将导致致命错误,因为false
是“非对象”,因为值是布尔值。
找出函数返回布尔值而不是对象的原因。 例如,检查$pdo
对象,查找上次发生的错误。 有关如何调试的详细信息将取决于如何处理特定函数/对象/类的错误。
如果连->prepare
都失败了,那么您的$pdo
数据库句柄对象没有传递到当前作用域中。 找到它的定义。 然后将其作为参数传递,作为属性存储或通过全局范围共享。
另一个问题可能是有条件地创建一个对象,然后试图调用该条件块之外的方法。 例如
if ($someCondition) {
$myObj = new MyObj();
}
// ...
$myObj->someMethod();
通过尝试在条件块外执行方法,可能无法定义对象。
相关问题:
又称死亡白页或死亡白屏。 当关闭错误报告并发生致命错误(通常是语法错误)时,就会发生这种情况。
如果您启用了错误日志记录,您将在错误日志中找到具体的错误消息。 这通常位于一个名为“php_errors.log”的文件中,或者位于中央位置(例如,许多Linux环境中的/var/log/apache2
),或者位于脚本本身的目录中(有时在共享宿主环境中使用)。
有时,临时启用错误显示可能更为简单。 然后白色页面将显示错误消息。 要小心,因为这些错误对访问网站的每个人都是可见的。
这可以通过在脚本顶部添加以下PHP代码轻松完成:
ini_set('display_errors', 1); error_reporting(~0);
代码将打开错误的显示,并将报告设置为最高级别。
因为ini_set()
是在运行时执行的,所以它对解析/语法错误没有影响。 这些错误将出现在日志中。 如果希望在输出中也显示它们(例如在浏览器中),则必须将display_startup_errors
指令设置为true
。 可以在php.ini
或.htAccess
中执行此操作,也可以通过运行时前影响配置的任何其他方法执行此操作。
您可以使用相同的方法设置log_errors和error_log指令来选择您自己的日志文件位置。
查看日志或使用显示,您将得到更好的错误消息和脚本停止的代码行。
相关问题:
相关错误: