这是什么?

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


当前回答

警告:[function]期望参数1是给定的布尔值

(一个更通用的警告:mysql_fetch_array()期望参数1是resource,给定布尔值)

资源是PHP中的一种类型(就像字符串、整数或对象一样)。资源是一个不透明的blob,本身没有固有的有意义的值。资源特定于一组PHP函数或扩展并由其定义。例如,Mysql扩展定义了两种资源类型:

MySQL模块中使用了两种资源类型。第一个是数据库连接的链接标识符,第二个是保存查询结果的资源。

cURL扩展定义了另外两种资源类型:

... 一个卷曲手柄和一个卷曲多手柄。

当var_dump时,这些值看起来像这样:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

这就是大多数资源的全部,某种类型((curl))的数字标识符((1))。

您携带这些资源并将它们传递给不同的函数,这些资源对这些函数有一定的意义。通常,这些函数在后台分配特定的数据,而资源只是它们用来在内部跟踪这些数据的引用。


“…期望参数1为resource,给定布尔值”的错误通常是一个未检查的操作的结果,该操作应该创建一个资源,但却返回false。例如,fopen函数有这样的描述:

返回值 成功时返回文件指针资源,错误时返回FALSE。

因此在这段代码中,$fp要么是类型为(stream)的资源(x),要么为false:

$fp = fopen(...);

如果你没有检查fopen操作是否成功或失败,因此$fp是一个有效的资源还是假的,并将$fp传递给另一个期望资源的函数,你可能会得到上述错误:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

你总是需要错误检查函数的返回值,这些函数试图分配资源,可能会失败:

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

相关的错误:

警告:mysql_fetch_array()期望参数1是resource, boolean给定

其他回答

致命错误:未定义类常量

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

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

解析错误:语法错误,意外的“[”

这个错误有两种形式:

变化1

$arr = [1, 2, 3];

这个数组初始化式语法只在PHP 5.4中引入;它将在此之前的版本上引发解析器错误。如果可能的话,升级你的安装或使用旧的语法:

$arr = array(1, 2, 3);

请参见本手册中的示例。

变化2

$suffix = explode(',', 'foo,bar')[1];

PHP 5.4中还引入了数组解引用函数结果。如果无法升级,你需要使用一个(临时)变量:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

请参见本手册中的示例。

已弃用:不支持使用花括号的数组和字符串偏移访问语法

在PHP 7.4.0之前,字符串偏移量和数组元素可以通过花括号{}访问:

$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1

自PHP 7.4.0起已弃用,并生成一个警告:

已弃用:不支持使用花括号的数组和字符串偏移访问语法

你必须使用方括号[]来访问字符串偏移量和数组元素:

$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1

此更改的RFC链接到一个PHP脚本,该脚本试图机械地修复此问题。

警告:open_basedir限制生效

此警告可以与与文件和目录访问相关的各种函数一起出现。它警告一个配置问题。

当它出现时,这意味着已禁止访问某些文件。

警告本身不会破坏任何东西,但如果文件访问被阻止,脚本通常无法正常工作。

修复方法通常是更改PHP配置,相关设置称为open_basedir。

有时使用了错误的文件或目录名称,解决方法是使用正确的名称。

相关问题:

Open_basedir限制生效。文件(/)不在允许路径内: 所有PHP的“警告:open_basedir限制在有效”的查询在Stackoverflow

致命错误:允许的内存大小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”问题