这是什么?

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


当前回答

警告:字符串偏移量为XXX

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

例子:

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

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

其他回答

警告:function()期望参数X为布尔值(或整数,字符串等)

如果传递给函数的参数类型错误(PHP不能自动转换),就会抛出警告。此警告标识出哪个参数有问题,以及预期的数据类型。解决方案:将指定的参数更改为正确的数据类型。


例如下面的代码:

echo substr(["foo"], 23);

输出结果:

PHP警告:substr()期望参数1是字符串,数组给定

警告:数组到字符串的转换

注意:数组到字符串的转换

(PHP 7.4之前的一个通知,PHP 8.0之后的一个警告)

如果你试图将数组视为字符串,就会发生这种情况:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

数组不能简单地与字符串回显或连接,因为结果没有很好地定义。PHP将使用字符串“Array”来代替数组,并触发通知,指出这可能不是预期的结果,您应该检查这里的代码。你可能想要这样的东西:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

或者循环数组:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

如果这个通知出现在您意想不到的地方,这意味着您认为是字符串的变量实际上是一个数组。这意味着你的代码中有一个错误,使这个变量成为一个数组,而不是你期望的字符串。

警告:[function]: failed to open stream: [reason]

当你通过include, require或fopen调用一个文件时,PHP无法找到该文件或没有足够的权限来加载该文件。

这种情况的发生有多种原因:

文件路径错误 文件路径是相对的 包含路径是错误的 权限限制太大 SELinux已生效 还有更多……

一个常见的错误是不使用绝对路径。这可以通过使用完整路径或神奇常数如__DIR__或dirname(__FILE__)轻松解决:

include __DIR__ . '/inc/globals.inc.php';

or:

require dirname(__FILE__) . '/inc/globals.inc.php';

确保使用正确的路径是排除这些问题的一个步骤,这也可能与不存在的文件、文件系统的权限阻止访问或PHP本身的打开basedir限制有关。

快速解决此问题的最佳方法是遵循下面的故障排除清单。

相关问题:

故障排除清单:无法打开流

相关的错误:

警告:open_basedir限制生效

some_function():参数#1必须是给定的x, y类型

这个错误不言自明。您的代码试图调用some_function(),并将错误类型的数据作为参数之一传递。例如:

<?php declare(strict_types=1);

function multiply(int $x, int $y) { return $x * $y; }

echo multiply("3", 4);

因为被调用的函数的第一个参数是int标量类型,并且调用是在一个启用了严格类型的文件中(stict_types=1),所以当传递字符串给它时,它会出现类型错误:

TypeError: multiply():参数#1 ($x)必须是类型为整型,字符串在…

这个例子来自3v4l.org。

注意:未定义变量

在尝试使用以前未定义的变量时发生。

一个典型的例子是

foreach ($items as $item) {
    // do something with item
    $counter++;
}

如果您之前没有定义$counter,上面的代码将触发通知。

正确的方法是在使用变量之前设置它

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

类似地,变量在其作用域之外是不可访问的,例如在使用匿名函数时。

$prefix = "Blueberry";
$food = ["cake", "cheese", "pie"];
$prefixedFood = array_map(function ($food) {
  // Prefix is undefined
  return "${prefix} ${food}";
}, $food);

这应该使用use来传递

$prefix = "Blueberry";
$food = ["cake", "cheese", "pie"];
$prefixedFood = array_map(function ($food) use ($prefix) {
  return "${prefix} ${food}";
}, $food);

注意:未定义的属性

此错误的含义大致相同,但指的是对象的属性。重用上面的示例,这段代码将触发错误,因为没有设置counter属性。

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

相关问题:

所有关于Stackoverflow的PHP“注意:未定义变量”问题 “注意:未定义的变量”,“注意:未定义的索引”,“注意:未定义的偏移量”使用PHP 参考:什么是变量作用域,哪些变量可以从哪里访问,什么是“未定义变量”错误?