Отладка устаревшего кода, и у меня странная проблема. Устаревший код переносится в PHP 7.2. Я не знаю, для какой версии PHP он был изначально написан, но он работает в PHP 5.6.
Ниже мой пример проблемы …
$variable = '';
$variable['key'] = 'Hello World!';
echo $variable['key'] // H
Когда я эхом $variable['key']
он получает только первый символ из значения. Теперь я знаю, что это потому, что $variable
первоначально объявлен как строка.
Но почему это работает в PHP 5.6? Что я могу сделать, чтобы это работало в 7.2, не просматривая тысячи строк кода?
Есть ли такая директива, как strict_types
Я могу использовать?
С 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. Вы можете использовать регулярное выражение, чтобы найти все места, где вам следует провести рефакторинг для решения проблемы.
Других решений пока нет …