Я играл с методом извлечения и заметил, что он не работает с отрицательными показателями.
Давайте возьмем этот фрагмент кода в качестве примера:
<?php
$arr = [0 => 'faa', 1 => 'fee', -2 => 'foo'];
$result = extract($arr, EXTR_PREFIX_INVALID, 'var');
echo $var_-2; // Absolutely wrong
?>
Поэтому я попытался сделать это:
echo ${'var_-2'} // Notice: Undefined variable: var_-2
Тогда с момента извлечения как задокументировано Вот
Возвращает количество переменных, успешно импортированных в таблицу символов
Я сделал это :
echo $result; // 2
Кажется, экстракт не импортировал -2
в таблицу символов в первую очередь.
Что именно является причиной, так как документация ничего не говорит об этом поведении?
Так как -
не является действительным символом в соответствии с Соглашения об именах переменных php.
Следующая цитата бесстыдно скопирована из документации:
Имена переменных следуют тем же правилам, что и другие метки в PHP. Допустимое имя переменной начинается с буквы или подчеркивания, за которым следует любое количество букв, цифр или подчеркивания. Как регулярное выражение, оно будет выражаться так: ‘[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *’
// var_-2 results in 0 because of -
var_dump(preg_match("/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/", "var_-2")); // int(0)
// var_2 is a valid identifier so result is 1
var_dump(preg_match("/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/", "var_2")); // int(1)
Других решений пока нет …