这是什么?

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

为什么会这样?

Questions like "Headers already sent" or "Calling a member of a non-object" pop up frequently on Stack Overflow. The root cause of those questions is always the same. So the answers to those questions typically repeat them and then show the OP which line to change in their particular case. These answers do not add any value to the site because they only apply to the OP's particular code. Other users having the same error cannot easily read the solution out of it because they are too localized. That is sad because once you understood the root cause, fixing the error is trivial. Hence, this list tries to explain the solution in a general way to apply.

我该怎么做呢?

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

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

列表

Nothing is seen. The page is empty and white. (also known as White Page/Screen Of Death) Code doesn't run/what looks like parts of my PHP code are output Warning: Cannot modify header information - headers already sent Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given a.k.a. Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource Warning: [function] expects parameter 1 to be resource, boolean given Warning: [function]: failed to open stream: [reason] Warning: open_basedir restriction in effect Warning: Division by zero Warning: Illegal string offset 'XXX' Warning: count(): Parameter must be an array or an object that implements Countable Parse error: syntax error, unexpected '[' Parse error: syntax error, unexpected T_XXX Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM Parse error: syntax error, unexpected 'require_once' (T_REQUIRE_ONCE), expecting function (T_FUNCTION) Parse error: syntax error, unexpected T_VARIABLE Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate XXX bytes) Fatal error: Maximum execution time of XX seconds exceeded Fatal error: Call to a member function ... on a non-object or null Fatal Error: Call to Undefined function XXX Fatal Error: Cannot redeclare XXX Fatal error: Can't use function return value in write context Fatal error: Declaration of AAA::BBB() must be compatible with that of CCC::BBB()' Return type of AAA::BBB() should either be compatible with CCC::BBB(), or the #[\ReturnTypeWillChange] attribute should be used Fatal error: Using $this when not in object context Fatal error: Object of class Closure could not be converted to string Fatal error: Undefined class constant Fatal error: Uncaught TypeError: Argument #n must be of type x, y given Notice: Array to string conversion (< PHP 8.0) or Warning: Array to string conversion (>= PHP 8.0) Notice: Trying to get property of non-object error Notice: Undefined variable or property "Notice: Undefined Index", or "Warning: Undefined array key" Notice: Undefined offset XXX [Reference] Notice: Uninitialized string offset: XXX Notice: Use of undefined constant XXX - assumed 'XXX' / Error: Undefined constant XXX MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ... at line ... Strict Standards: Non-static method [<class>::<method>] should not be called statically Warning: function expects parameter X to be boolean/string/integer HTTP Error 500 - Internal server error Deprecated: Arrays and strings offset access syntax with curly braces is deprecated

还看到:

这个符号在PHP中是什么意思?


当前回答

解析错误:语法错误,意外的T_ENCAPSED_AND_WHITESPACE

在PHP 8.0及以上版本中,该消息改为:

语法错误,意外的字符串内容“”,期望“-”或标识符或变量或数字

当试图在双引号字符串中引用带有引号键的数组值时,当整个复杂变量结构没有包含在{}中时,最常遇到此错误。

错误情况:

这将导致意外的T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

可能的修复:

在双引号字符串中,PHP将允许数组关键字字符串不带引号使用,并且不会发出E_NOTICE。所以上面可以写成:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

整个复杂数组变量和键可以被括在{}中,在这种情况下,它们应该被引用以避免E_NOTICE。PHP文档对于复杂变量推荐使用这种语法。

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

当然,上述任何一种方法的替代方法都是将数组变量连接到,而不是插值它:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

如需参考,请参阅PHP字符串手册页中的变量解析部分

其他回答

致命错误:当不在对象上下文时使用$this

$是PHP中的一个特殊变量,不能被赋值。如果在不存在该对象的上下文中访问该对象,则给出此致命错误。

此错误可能发生:

If a non-static method is called statically. Example: class Foo { protected $var; public function __construct($var) { $this->var = $var; } public static function bar () { // ^^^^^^ echo $this->var; // ^^^^^ } } Foo::bar(); How to fix: review your code again, $this can only be used in an object context, and should never be used in a static method. Also, a static method should not access the non-static property. Use self::$static_property to access the static property. If code from a class method has been copied over into a normal function or just the global scope and keeping the $this special variable. How to fix: Review the code and replace $this with a different substitution variable.

相关问题:

致命错误:当不在对象上下文中时使用$this 致命错误:当不在对象上下文中时使用$this 所有“使用$this时不在对象上下文”的问题在Stackoverflow

致命错误:超过XX秒的最大执行时间

每个PHP页面请求或脚本调用都度量PHP代码执行了多长时间。如果达到配置的限制,脚本将使用此消息中止。

注意,时间通常不包括发生在PHP“外部”的事情,例如等待数据库结果的时间,或使用shell_exec执行的外部程序等。例外情况是当PHP在Windows上运行时,测量的时间是“时钟时间”,并且确实包括这些外部等待时间。

常见的原因

无限循环。写错的while, do…while或for循环可能永远不会完成,这意味着PHP将永远持续运行。甚至foreach循环也可以是无限的,例如循环遍历一个Iterator对象或生成器函数。 庞大的数据集。即使您的循环不是无限的,如果它正在做很多工作,如果它正在处理大量的结果,它可能需要很长时间才能完成。

改变限制

如果你知道你有一个缓慢的过程,你可以配置时间限制:

在php.ini中,使用max_execution_time设置。 在脚本运行时,使用set_time_limit函数。注意,调用这个函数会将测量的时间重置为零,因此执行set_time_limit(10);意思是“再给10秒钟,不管脚本已经花了多长时间”。

这两种机制都应该给出一个秒数,或者特殊值0,表示“不限制”。设置“无限制”对于你真正想在后台永远运行的命令行脚本是最有用的;对于网页,最好设置一些有限值,即使它非常大,以防止代码中的错误导致整个系统失去响应。

解析错误:语法错误,意外的T_PAAMAYIM_NEKUDOTAYIM

范围解析操作符也被称为“Paamayim Nekudotayim”,源自希伯来语פייםנקדיים”。意思是“双冒号”。

如果您无意中在代码中放入::,则通常会发生此错误。

相关问题:

参考:PHP语法错误;以及如何解决这些问题? PHP中两个冒号是什么意思? 在PHP中::(双冒号)和->(箭头)之间的区别是什么? 意外T_PAAMAYIM_NEKUDOTAYIM,期望T_NS_Separator

文档:

范围解析运算符(::)

解析错误:语法错误,意外的T_XXX

当你在意想不到的地方有T_XXX令牌,不平衡的(多余的)括号,在php.ini中使用短标记而没有激活它,以及更多情况时发生。

相关问题:

参考:PHP语法错误;以及如何解决这些问题? 解析错误:语法错误:意外的“{” 解析错误:语法错误,在我的PHP代码文件意外结束 解析错误:语法错误,意外的“<”-修复? 解析错误:语法错误,意外的'?'

如需进一步帮助,请参阅:

http://phpcodechecker.com/ -它确实为你的语法问题提供了一些更有用的解释。

警告:不能修改报头信息-报头已经发送

当您的脚本试图向客户端发送HTTP报头,但之前已经有输出,导致报头已经发送到客户端时发生。

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

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

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

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

您可以通过遍历代码触发Warning之前的行并检查它输出的位置来解决这个问题。移动任何头发送代码之前的代码。

一个经常被忽略的输出是PHP关闭?>后的新行。当?>是文件中的最后一个内容时,省略它被认为是一种标准实践。同样,出现此警告的另一个常见原因是当开头<?php前面有一个空格,行,或者不可见的字符,导致web服务器发送报头和空格/换行,这样当php开始解析时就不能提交任何报头。

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

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

相关问题:

头文件已经被PHP发送 所有PHP“头已经发送”的问题在Stackoverflow 字节顺序标记 什么PHP函数可以创建输出?