PHP 5.6 — PHP Неверное объявление переменной

Отладка устаревшего кода, и у меня странная проблема. Устаревший код переносится в 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 Я могу использовать?

9

Решение

С 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. Вы можете использовать регулярное выражение, чтобы найти все места, где вам следует провести рефакторинг для решения проблемы.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]