с php.net
Внимание!
Запись в смещение вне диапазона дополняет строку пробелами. Нецелые типы преобразуются в целые. Неверный тип смещения испускает E_NOTICE. Используется только первый символ назначенной строки. Начиная с PHP 7.1.0, назначение пустой строки приводит к фатальной ошибке. Раньше ему присваивался нулевой байт.
http://php.net/manual/en/language.types.string.php#language.types.string.substr
Таким образом, «ключ» преобразуется в 0, и первый символ устанавливается.
Поскольку это тип символа, из данной строки устанавливается только «H».
$variable = '';
$variable['key'] = 'Hello World!';
echo $variable;
echo $variable['key'];
Если вы измените свой код на вышеприведенный, вы лучше увидите, что происходит.
Таким образом, текст "мир Эло!" потерян и ушел в PHP> = 7.1, потому что вы устанавливаете первый символ, тип остается string
.
В php 5.6 вы получите
Notice: Array to string conversion in /in/N2poP on line 6
Таким образом, в предыдущих версиях вы перезаписывали полную переменную, и исходная пустая строка исчезла, PHP просто создает новый массив. Такое поведение происходит только с пустой строкой!
Это также отмечено в документации:
http://php.net/manual/en/language.types.string.php#language.types.string.substr
Примечание. Начиная с PHP 7.1.0, применение оператора пустого индекса к пустому
строка генерирует фатальную ошибку. Раньше пустая строка была молча
преобразован в массив.
Самое простое решение - удалить часть $variable = '';
, она в любом случае недействительна и никогда не используется в вашем устаревшем коде. или заменив его на $variable = [];
Так как это происходит только с пустой строкой в php <7.1, вы можете использовать регулярное выражение, чтобы найти все места, где вам следует выполнить рефакторинг для устранения проблемы. </p>