Сообщение: Попытка доступа к смещению массива по значению типа null

Я несколько раз получаю эту ошибку в скрипте (invoiceplane), который я использую уже несколько лет, но который, к сожалению, не поддерживается его создателями:

Message: Trying to access array offset on value of type null

Мой сервер был обновлен до PHP 7.4, и я ищу способ исправить проблемы и самостоятельно поддерживать скрипт, так как я им очень доволен.

Это то, что находится в строке, которая дает ошибку:

$len = $cOTLdata['char_data'] === null ? 0 : count($cOTLdata['char_data']);

$cOTLdata передается в функцию:

public function trimOTLdata(&$cOTLdata, $Left = true, $Right = true)
{
    $len = $cOTLdata['char_data'] === null ? 0 : count($cOTLdata['char_data']);
    $nLeft = 0;
    $nRight = 0;
    //etc

Кстати, он включен в mpdf, но простая перезапись файлов из репозитория github не исправила ошибки.


person vespino    schedule 14.12.2019    source источник
comment
Измените его на $len = count($cOTLdata['char_data'] ?? []);   -  person Yevgeniy Afanasyev    schedule 27.08.2020
comment
У меня была такая же авария; Исправил, перейдя на mpdf8 (думаю по номеру версии)   -  person Owen Beresford    schedule 04.06.2021


Ответы (1)


Это происходит потому, что $cOTLdata не равно null, а индекс 'char_data' не существует. Предыдущие версии PHP, возможно, были менее строги к таким ошибкам и молча проглатывали ошибку/уведомление, в то время как 7.4 больше этого не делает.

Чтобы проверить, существует ли индекс, вы можете использовать isset():

isset($cOTLdata['char_data'])

Это означает, что строка должна выглядеть примерно так:

$len = isset($cOTLdata['char_data']) ? count($cOTLdata['char_data']) : 0;

Обратите внимание, что я поменял местами then и else тернарного оператора, поскольку === null — это, по сути, то, что isset уже делает (но в положительном случае).

person ArSeN    schedule 14.12.2019
comment
Кажется логичным, ударить себя, думая, что я мог бы подумать об этом сам. Винить вчерашнюю ночь, было поздно :) Будет адская работа, чтобы изменить все эти события, но это лучше, чем переход на другую систему. Сначала я проверю это с одним случаем. Спасибо. - person vespino; 14.12.2019
comment
у меня есть эта ошибка я не понимаю ваше объяснение - person kipruto; 25.07.2020
comment
@kipruto Если вы не найдете ответ удовлетворительным, вы всегда можете задать новый вопрос. Однако обратите внимание, что даже это было помечено как дубликат, поскольку это довольно распространенный вопрос, поэтому чтение других ответов может быть хорошим первым шагом. - person ArSeN; 26.07.2020
comment
Переход @kipruto на php7.2 исправляет эту ошибку - person 00-BBB; 18.03.2021
comment
Я настоятельно рекомендую не использовать старую версию PHP, которая больше не поддерживается, как это дело в 7.2. - person ArSeN; 18.03.2021
comment
Нет, не всегда. при выполнении дампа я вижу, что индекс ДЕЙСТВИТЕЛЬНО существует, но PHP 7.1 продолжает настаивать на том, что это не так. - person Debbie Kurth; 13.06.2021