提问者:小点点

引用-这个错误在PHP中是什么意思?


这是您在编写PHP时可能遇到的警告,错误和注意事项的一些答案,并且您不知道如何修复它们。 这也是一个社区Wiki,所以每个人都被邀请加入和维护这个列表。

堆栈溢出时经常会弹出“已经发送了报头”或“调用非对象的成员”之类的问题。 这些问题的根源总是一样的。 因此,这些问题的答案通常会重复它们,然后向OP显示在它们的特定情况下要更改的行。 这些答案不会给站点增加任何价值,因为它们只适用于OP的特定代码。 具有相同错误的其他用户无法轻松地从中读取解决方案,因为他们太本地化了。 这是可悲的,因为一旦您理解了根本原因,修复错误就变得微不足道了。 因此,本列表试图以一种通用的方式来解释解决方案。

如果您的问题被标记为此问题的重复,请在下面找到您的错误消息,并将修复程序应用到您的代码中。 答案通常包含进一步的链接来调查,以防仅仅从一般答案就不清楚。

如果您想贡献,请添加您“最喜欢的”错误信息,警告或通知,每个答案一个,简短的说明它的含义(即使只是在手册页上突出显示术语),可能的解决方案或调试方法,以及现有的有价值的Q&a列表。 另外,请随时改进现有的答案。

  • 什么也没看到。 页面是空的和白色的。 (又称白页/死神屏)
  • 代码不运行/似乎我的PHP代码的一部分被输出
  • 警告:无法修改标头信息-标头已发送
  • 警告:mysql_fetch_array()期望参数1为资源,给定布尔值。
    警告:mysql_fetch_array():提供的参数不是有效的MySQL结果资源。
    警告:mysql_num_rows()期望参数1为mysql_result,给定布尔值(或类似变体)
  • 警告:[function]要求参数1为资源,给定了布尔值
  • 警告:[函数]:无法打开流:[原因]
  • 警告:open_basedir限制生效
  • 警告:被零除
  • 警告:非法字符串偏移量“xxx”
  • 警告:count():参数必须是数组或实现countable的对象
  • 分析错误:语法错误,意外的“[”
  • 分析错误:语法错误,意外的T_XXX
  • 分析错误:语法错误,意外的t_encapsed_and_whitespace
  • 分析错误:语法错误,意外的T_PAAMAYIM_NEKUDOTAYIM
  • 分析错误:语法错误,意外的“require_once”(T_REQUIRE_ONCE),需要函数(T_FUNCTION)
  • 分析错误:语法错误,意外的t_variable
  • 致命错误:允许的内存大小XXX字节耗尽(尝试分配XXX字节)
  • 致命错误:调用非对象或空的成员函数。。。
  • 致命错误:调用未定义的函数xxx
  • 致命错误:无法重新声明xxx
  • 致命错误:无法在写入上下文中使用函数返回值
  • 致命错误:AAA::BBB()的声明必须与CCC::BBB()‘
  • 的声明兼容
  • 致命错误:不在对象上下文中时使用$this
  • 致命错误:无法将类闭包的对象转换为字符串
  • 致命错误:未定义类常量
  • 注意:数组到字符串的转换
  • 注意:尝试获取非对象错误的属性
  • 注意:未定义的变量或属性
  • 注意:未定义索引
  • 注意:未定义偏移量XXX[参考]
  • 注意:未初始化的字符串偏移量:xxx
  • 注意:使用未定义常数XXX-假定为“XXX”
  • MySQL:您的SQL语法中有一个错误; 检查与您的MySQL server版本相对应的手册,以便在第...
  • 行附近使用正确的语法
  • 严格标准:非静态方法[::] 不应静态调用
  • 警告:函数要求参数X为布尔值/字符串/整数
  • HTTP错误500-内部服务器错误
  • 不推荐使用:不推荐使用带有花括号的数组和字符串偏移量访问语法

另请参见:

  • 引用-这个符号在PHP中是什么意思?

共3个答案

匿名用户

当您的脚本试图向客户端发送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时。

相关问题:

  • PHP已发送的头
  • StackOverflow上的所有PHP“Headers已发送”问题
  • 字节顺序标记
  • 哪些PHP函数创建输出?

匿名用户

发生在类似于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();

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

相关问题:

  • 调用非对象上的成员函数
  • 列出关于StackOverflow的所有PHP“Fatal Error:Call to a member function.。。on a Non-Object”问题

匿名用户

又称死亡白页或死亡白屏。 当关闭错误报告并发生致命错误(通常是语法错误)时,就会发生这种情况。

如果您启用了错误日志记录,您将在错误日志中找到具体的错误消息。 这通常位于一个名为“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指令来选择您自己的日志文件位置。

查看日志或使用显示,您将得到更好的错误消息和脚本停止的代码行。

相关问题:

    PHP的白色死神屏幕
  • 死亡白屏!
  • PHP不显示错误消息
  • PHP在错误上发出500-这在哪里被记录?
  • 如何在PHP中获取有用的错误消息?
  • 关于StackOverflow的所有PHP“White Page of Death”问题

相关错误:

  • 分析错误:语法错误,意外的T_XXX
  • 致命错误:调用非对象上得成员函数。。。
  • 代码不运行/似乎我的PHP代码的一部分被输出