Я постараюсь быть максимально объяснительным.
У меня есть приложение PHP + jQuery (какая-то текстовая игра), где система постоянно читает и записывает файлы JSON с помощью AJAX. Под PHP 7.4 все абсолютно идеально, однако при обновлении до 8.0 или 8.1 (мой хостинг вынуждает) AJAX ломается.
Проверяя консоль JS, сразу после самого первого вызова AJAX я получаю ОШИБКУ 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();
Я попытался добавить параметр $assoc в функцию PHP json_decode(), но это не помогло. Я действительно понятия не имею, как это решить, кроме как перейти на PHP 7.4... однако я больше не могу этого делать.
EDITED: удален ненужный код, изображение и информация.
EDITED2: Название изменено на более пояснительное предложение.
У вас есть ошибка в функции, так как же вы вызываете функцию! И какие параметры вы передаете
PHP 8 стал более конкретным в отношении типов данных. Больше нельзя ни во что кидаться и надеяться на лучшее
Ошибка говорит сама за себя: PHP Fatal error: Uncaught TypeError: array_key_exists():. Вам нужно сосредоточиться на строке 36 в вашем PHP-коде. ПРИМЕЧАНИЕ. Через 30 секунд после того, как я набрал этот комментарий, я заметил отличный ответ: stackoverflow.com/a/75892872/421195. Пожалуйста, «примите» и «проголосуйте».






Вызов AJAX не потерпел неудачу. Сообщение об ошибке явно указывает на PHP, поэтому весь этот JavaScript не имеет значения.
Глядя на сообщение об ошибке и код PHP, который вы разместили, переменная $data является объектом.
В документации для array_key_exists() сказано следующее:
По соображениям обратной совместимости array_key_exists() также будет вернуть true, если ключ является свойством, определенным в объекте, указанном как множество. Это поведение устарело, начиная с PHP 7.4.0, и удалено с PHP 8.0.0.
Чтобы проверить, существует ли свойство в объекте, property_exists() должен быть использован.
Вы должны обновить строку 36 до этого:
if (!property_exists($data,$g[1]))
Обратите внимание, что порядок параметров обратный от array_key_exists()
Спасибо, Тангенциально. Мне стыдно за себя. Я много работал с «property_exists» в других экземплярах моего кода и пропустил здесь столь тривиальное решение. Спасибо, правда! \м/
@Tangentially Perpendicular: ваш ответ НАМНОГО лучше для этого конкретного «симптома» (ошибка PHP 8 Uncaught TypeError: array_key_exists()), чем для так называемого «дубликата». +1.
Ну, если вы изменили версию PHP, код javascript не имеет к этому никакого отношения.