这是什么?

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


当前回答

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

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

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

$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;

相关的错误:

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

其他回答

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

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

相关问题:

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

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

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

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

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


例如下面的代码:

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

输出结果:

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

严格标准:非静态方法[<class>::<method>]不应该被静态调用

当您试图在类上调用静态的非静态方法时发生,并且您在error_reporting()设置中也有E_STRICT标志。

例子:

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br()或$ HTML::br()

实际上,您可以通过不向error_reporting()添加E_STRICT来避免此错误,例如

error_reporting(E_ALL & ~E_STRICT);

因为对于PHP 5.4.0及以上版本,E_STRICT包含在E_ALL [ref]中。但这并不可取。解决方案是将你想要的静态函数定义为实际的静态函数:

public static function br() {
  echo '<br>';
}

或者按常规调用函数:

$html = new HTML();
$html->br();

相关问题:

我如何解决“非静态方法xxx:xxx()不应该在PHP 5.4中被静态调用?”

致命错误:未定义类常量

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

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

致命错误:当不在对象上下文时使用$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