这是什么?

这是一些关于在编程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中是什么意思?


当前回答

注意:未初始化的字符串偏移量:*

顾名思义,当您很可能试图遍历或从具有不存在键的数组中查找值时,就会发生此类错误。

考虑到您正在尝试显示$string中的每个字母

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

上面的例子将生成(在线演示):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

并且,一旦脚本完成回显D,你就会得到错误,因为在for()循环中,你已经告诉PHP显示你从'ABCD'的第一个到第五个字符串字符,存在,但由于循环从0开始计数,并在到达4时回显D,它将抛出偏移错误。

类似的错误:

非法字符串偏移量'选项1'

其他回答

致命错误:未定义类常量

此错误意味着您试图使用不存在的类常量。与其他“未定义”的通知和警告不同,这是一个致命错误,将立即停止脚本。

首先要检查的是印刷错误。确认在类中定义了常量,并且使用适当的名称空间调用它。还要确认已包含用于解析常量的所有适当文件。

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

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

相关问题:

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

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

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

致命错误:调用未定义的函数XXX

在尝试调用尚未定义的函数时发生。常见的原因包括缺少扩展和包含,有条件的函数声明,函数声明中的函数或简单的拼写错误。

例1 -条件函数声明

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

在这种情况下,fn()将永远不会被声明,因为$someCondition不为真。

例2 -函数声明中的函数

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

在这种情况下,只有在调用createFn()时才声明fn。注意,后续调用createFn()将触发一个关于重新声明现有函数的错误。

在PHP内置函数中也可以看到这种情况。尝试在官方手册中搜索该函数,并检查它属于哪个“扩展”(PHP模块),以及哪些版本的PHP支持它。

如果缺少扩展,请安装该扩展并在php.ini中启用它。请参阅PHP手册中的安装说明,以了解函数在扩展中的显示。你也可以使用你的包管理器(例如Debian或Ubuntu中的apt, Red Hat或CentOS中的yum),或共享托管环境中的控制面板来启用或安装扩展。

如果该函数是在您正在使用的PHP的新版本中引入的,那么您可以在手册或评论部分中找到替代实现的链接。如果它已从PHP中删除,请查找有关原因的信息,因为可能不再需要它了。

如果缺少include,请确保在调用函数之前包含声明该函数的文件。

如果出现错别字,请改正错别字。

相关问题:

https://stackoverflow.com/search?q=Fatal+error%3A+Call+to+undefined+function

"注意:未定义索引"或"警告:未定义数组键"

当您试图通过数组中不存在的键访问数组时发生。

一个典型的Undefined Index通知的例子是(demo)

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

数组中菠菜和1都不存在,会触发E_NOTICE。在PHP 8.0中,这是一个E_WARNING。

解决方案是确保在访问索引之前存在索引或偏移量。这可能意味着您需要修复程序中的一个错误,以确保这些索引在您期望它们存在时确实存在。或者这可能意味着你需要使用array_key_exists或isset来测试索引是否存在:

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

如果你有这样的代码:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

那么$_POST['message']将不会在这个页面第一次加载时设置,你将得到上述错误。只有在提交表单并再次运行此代码时,数组索引才会存在。你通常用以下方法检查:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

相关问题:

参考文献:“Notice: Undefined variable”和“Notice: Undefined index” 所有关于Stackoverflow的PHP“注意:未定义的索引”问题 http://php.net/arrays

警告:字符串偏移量为XXX

当您尝试使用方括号语法访问数组元素时,就会发生这种情况,但您是在字符串上执行此操作,而不是在数组上执行此操作,因此该操作显然没有意义。

例子:

$var = "test";
echo $var["a_key"];

如果你认为变量应该是一个数组,看看它来自哪里并修复那里的问题。