这是什么?

这是一些关于在编程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_VARIABLE

可能的场景

我似乎找不到我的代码出了什么问题。以下是我的全部错误:

解析错误:语法错误,意外的T_VARIABLE在x行

我正在尝试的

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

回答

解析错误:程序的语法问题,例如在语句的末尾遗漏了分号,或者像上面的情况一样,遗漏了。操作符。解释器在遇到解析错误时停止运行程序。

简单地说,这是一个语法错误,这意味着您的代码中有一些东西阻止了它被正确解析,从而无法运行。

您应该做的是仔细检查错误所在的行周围是否有任何简单的错误。

该错误消息意味着,在文件的第x行,PHP解释器期望看到一个开括号,但相反,它遇到了名为T_VARIABLE的东西。T_VARIABLE这个东西叫做令牌。它是PHP解释器表达程序不同基本部分的方式。当解释器读入程序时,它将您所编写的内容转换为令牌列表。无论你在程序中放入一个变量,解释器的列表中都会有一个aT_VARIABLE令牌。

不错的阅读:解析器令牌列表

因此,请确保在php.ini中至少启用了E_PARSE。产品脚本中不应该存在解析错误。

我总是建议在编码时添加以下语句:

error_reporting(E_ALL);

PHP错误报告

另外,使用IDE是个好主意,它可以让你在输入时知道解析错误。你可以使用:

NetBeans(一个漂亮的免费软件)(在我看来是最好的) PhpStorm(戈登叔叔喜欢这个:P,付费计划,包含专有和免费软件) Eclipse(美女与野兽,免费软件)

相关问题:

参考:PHP语法错误;以及如何解决这些问题?

其他回答

注意:使用未定义的常量XXX -假设“XXX”

或者,在PHP 7.2或更高版本中:

警告:使用未定义的常量XXX -假设“XXX”(这将在未来的PHP版本中抛出错误)

或者,在PHP 8.0或更高版本中:

错误:未定义常量XXX

这种情况发生在代码中使用令牌并且看起来是常量,但没有定义该名称的常量时。

引起此通知的最常见原因之一是没有引用用作关联数组键的字符串。

例如:

// Wrong
echo $array[key];

// Right
echo $array['key'];

另一个常见的原因是变量名前缺少$ (dollar)符号:

// Wrong
echo varName;

// Right
echo $varName;

或者你可能拼写错了其他常数或关键字:

// Wrong
$foo = fasle;

// Right
$foo = false;

当您试图访问由该库定义的常量时,这也可能表明缺少所需的PHP扩展或库。

相关问题:

PHP错误消息“注意:使用未定义的常量”是什么意思?

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

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

相关问题:

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

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

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

致命错误:允许的内存大小XXX字节已耗尽(已尝试分配XXX字节)

没有足够的内存来运行脚本。PHP已达到内存限制并停止执行。这个错误是致命的,脚本停止。内存限制的值可以在php.ini文件中配置,也可以使用ini_set('memory_limit', '128 M');在脚本中(将覆盖php.ini中定义的值)。内存限制的目的是防止一个PHP脚本占用所有可用内存,导致整个web服务器瘫痪。

The first thing to do is to minimise the amount of memory your script needs. For instance, if you're reading a large file into a variable or are fetching many records from a database and are storing them all in an array, that may use a lot of memory. Change your code to instead read the file line by line or fetch database records one at a time without storing them all in memory. This does require a bit of a conceptual awareness of what's going on behind the scenes and when data is stored in memory vs. elsewhere.

如果在脚本没有执行内存密集型工作时发生此错误,则需要检查代码以查看是否存在内存泄漏。memory_get_usage函数是您的朋友。

相关问题:

所有“Fatal error: Allowed memory size of XXX bytes exhausted”问题

HTTP错误500 -内部服务器错误

HTTP状态代码500和典型的Apache或浏览器警告是一个非常广泛的消息。这不是实际的错误。要弄清楚是web服务器配置错误(.htaccess)还是PHP致命错误,你必须查看error.log。

你通常可以在下面找到webservers日志:

/var/log/apache2 on Linux servers, often used for local and virtual hosts. /var/www/_user12345_/logs or similar on shared hosting plans. Usually there's a logs/ directory alongside each htdocs/ folder. C:\xampp\apache\logs\error.log for WAMP/XAMPP distributions of Apache+PHP. Alternatively just use a file search feature to locate anything called "error.log". Or look into your Apache httpd.conf and its ErrorLog directive. /var/log/nginx/nginx_error.log for NGINX. C:\inetpub\logs\LogFiles for IIS. Luckily this is uncommon still, but journalctl -r -u apache2.service could also hold parts of the log on Linux setups.

它是一个文本文件。搜索与错误时间最接近的条目,并使用错误消息的重要部分(从“PHP error:…”到“in line…”)进行进一步的google搜索。

[Mon 22:10] [:error] [pid 12345] [client 127.0.0.1] FastCGI: server "/fcgi/p73" stderr: PHP message:PHP error: Unfiltered inputvariable $_JSON['pokestop_lng'] in filyfile.php on line 845

对于FPM设置,你经常会看到致命的PHP错误。而旧的mod_php(共享主机)配置经常混合警告和通知(通常也值得检查)。

如果没有配置为使用系统或Apache日志机制,您可能还需要查看PHP的error.log。一般来说,保留默认值并启用error_display + error_reporting来显示具体的错误会更简单。HTTP 500全捕获页面不过是PHP死机白屏幕的一个变种。

参见:

500内部服务器错误的php文件,而不是html 我怎么能让PHP显示错误,而不是给我500内部服务器错误 如何在IIS7上显示和记录PHP错误? 如何修复WordPress内部服务器的500个错误

注意:试图获取非对象错误的属性

在没有对象时试图访问对象的属性时发生。

非对象通知的一个典型例子是

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

在本例中,$users是一个数组(因此不是一个对象),它没有任何属性。

这类似于访问数组中不存在的索引或键(参见注意:未定义索引)。

这个例子简化了很多。大多数情况下,这样的通知表示一个未检查的返回值,例如,如果一个对象不存在,或者只是一个意外的非对象值(例如,在Xpath结果中,具有意外格式的JSON结构,具有意外格式的XML等),库将返回NULL,但代码不会检查这样的条件。

由于这些非对象通常会被进一步处理,因此在对非对象调用对象方法时经常会发生致命错误(参见:致命错误:调用成员函数…在非对象上)停止脚本。

通过检查错误条件和/或变量是否符合期望,可以很容易地防止这种情况。下面是一个带有DOMXPath示例的通知:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

问题是访问第一项的nodeValue属性(字段),而没有检查它是否存在于$result集合中。相反,通过将变量分配给代码所操作的对象,可以使代码更加显式:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

相关的错误:

注意:未定义索引 致命错误:调用成员函数…在一个非物体上