PHP Неверное объявление переменной - PullRequest
0 голосов
/ 16 ноября 2018

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

1 Ответ

0 голосов
/ 16 ноября 2018

с 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>

...