此问题在此处已有答案:
PHP check whether property exists in object or class(10个答案)
4天前关闭。
我会尽可能多地解释。
我有一个PHP+jQuery应用程序(某种文本游戏),系统一直在用 AJAX 阅读JSON文件。在PHP 7.4下一切都非常完美,然而,当我升级到8.0或8.1时(我的主机强迫我)AJAX崩溃了。
检查JS控制台,就在第一次 AJAX 调用之后,我得到了一个ERROR 500。所以,我假设它发生在PHP端,并且我是对的。我确实看了一下Apache日志,发现那里发生了一个PHP致命错误-但请注意,在PHP7.4下,根本没有问题。
我的Apache日志错误:
PHP Fatal error: Uncaught TypeError: array_key_exists():
Argument #2 ($array) must be of type array,
stdClass given in /home/xxx/zzz.com/motor/FileDriver.php:36,
referer: https://zzz.com/yyy/xxx/
这是发生错误的PHP文件,第36行:
function save() {
$n = func_num_args();
$g = func_get_args();
$data = json_decode(file_get_contents($g[0]));
if (!array_key_exists($g[1], $data))
$data->{$g[1]} = new StdClass();
if (($n == 4) && (!array_key_exists($g[2], $data->{$g[1]})))
$data->{$g[1]}->{$g[2]} = new StdClass();
if ($n == 3)
$data->{$g[1]} = $g[2];
else if ($n == 4)
$data->{$g[1]}->{$g[2]} = $g[3];
unlink($g[0]);
file_put_contents($g[0], json_encode($data, JSON_PRETTY_PRINT));
}
错误发生在这里:
$data = json_decode(file_get_contents($g[0]));
// THE ERROR BELOW!
if (!array_key_exists($g[1], $data))
$data->{$g[1]} = new StdClass();
我尝试在PHPjson_decode()函数中添加**$assoc**参数,但没有任何帮助。我真的不知道该如何解决这个问题,除了降级到PHP 7.4......然而,再也做不到了。
已编辑:删除了不相关的代码、图像和信息。
编辑2:将标题调整为更详细的句子。
1条答案
按热度按时间jdgnovmf1#
AJAX 调用并没有失败,错误消息明确指向PHP,所以所有这些JavaScript都是无关紧要的。
查看错误消息和您发布的PHP代码,变量
$data
是一个对象。array_key_exists()
的文档是这样说的:由于向后兼容的原因,如果key是一个定义在数组中的属性,array_key_exists()也将返回true。这种行为从PHP 7.4.0开始就不推荐使用,从PHP 8.0.0开始被删除。
要检查对象中是否存在属性,应使用property_exists()。
你应该把第36行更新为:
请注意,参数的顺序与
array_key_exists()
相反