На основе ручных определений EXTR_PREFIX_SAME
создаст переменные на основе имени ключа, и если переменная в локальном пространстве уже существует, к имени переменной будет добавлен префикс.
В отличие от этого, EXTR_PREFIX_IF_EXISTS
будет наследовать поведение EXTR_IF_EXISTS
(только перезаписывать, если переменные уже существуют), но вместо перезаписывания локальных переменных будет создана префиксная версия.
Рассмотрим следующий
$array = Array();
$array['foo'] = 'foo';
$array['bar'] = 'bar';
$array['baz'] = 'baz';
$foo = 'local foo';
$bar = 'local bar';
extract($array, EXTR_PREFIX_SAME, 'pre');
print_r(get_defined_vars());
//partial output
//Array
//(
// [array] => Array
// (
// [foo] => foo
// [bar] => bar
// [baz] => baz
// )
//
// [foo] => local foo
// [bar] => local bar
// [pre_foo] => foo
// [pre_bar] => bar
// [baz] => baz
//)
Так с EXTR_PREFIX_SAME
, значения $ Foo и $ бар останется такой же, и будут определены три новые локальные переменные ($ pre_foo, $ pre_bar и $ БАЗ) , Однако, если мы используем EXTR_PREFIX_IF_EXISTS
$array = Array();
$array['foo'] = 'foo';
$array['bar'] = 'bar';
$array['baz'] = 'baz';
$foo = 'local foo';
$bar = 'local bar';
extract($array, EXTR_PREFIX_IF_EXISTS, 'pre');
print_r(get_defined_vars());
//partial output
//Array
//(
// [array] => Array
// (
// [foo] => foo
// [bar] => bar
// [baz] => baz
// )
//
// [foo] => local foo
// [bar] => local bar
// [pre_foo] => foo
// [pre_bar] => bar
//)
Значения $ Foo и $ бар до сих пор сохранились, но только две новые переменные импортируются в локальное пространство. Поскольку $ baz не является переменной, которая уже существует, EXTR_PREFIX_IF_EXISTS
сообщает PHP игнорировать ключ «baz» в массиве.
Благодаря кучу! Слишком быстро читал и пропустил соединение с «EXTR_IF_EXISTS». Теперь имеет смысл. Спасибо Алану Шторму и Джейсону внизу. – CartoonChess
Формулировка в руководстве не совсем понятна - мне пришлось провести несколько экспериментов, чтобы выяснить, как они себя ведут. –