[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обработка констант в кавычках
Alex7777
Объясните, почему в этом случае, переменная $n имеет численное значение,
<?php 

$flags = array(
"PREG_PATTERN_ORDER",
"PREG_SET_ORDER",
"PREG_SET_ORDER|PREG_OFFSET_CAPTURE",
);


foreach ($flags as $name) {
$n=eval("return $name;");

echo gettype($n);
echo "\n<br>";
}
?>


а в этом:

<?php 

$flags = array(
"PREG_PATTERN_ORDER",
"PREG_SET_ORDER",
"PREG_SET_ORDER|PREG_OFFSET_CAPTURE",
);


foreach ($flags as $name) {
$n=eval("return $name;");

echo gettype($n);
echo "\n<br>";
}
?>

строковое?
PHP только начал изучать, про обработку строк в апострофах и кавычках читал, но в данном случае не понимаю почему так получается.
Valick
Во первых у вас оба кода одинаковые
Во вторых используйте var_dump() вместо gettype()
Ну и вопрос на засыпку, откуда вы взяли этот код в качестве примера для объяснения различий между кавычками и апострофами?

_____________
Стимулятор ~yoomoney - 41001303250491
walerus
Вам не кажется что скрипты одинаковы?

Valick
laugh.gif
Alex7777
Цитата (Valick @ 16.12.2014 - 10:08)
Во первых у вас оба кода одинаковые
Во вторых используйте var_dump() вместо gettype()
Ну и вопрос на засыпку, откуда вы взяли этот код в качестве примера для объяснения различий между кавычками и апострофами?

Прошу прощения, второй код должен быть таким. В данном случае var_dump() или
gettype() не имеет значения. Мне не понятно, почему eval в одном случае возвращает значение в int, а в другом string. Код из книги Котерова, просто я убрал лишнее, что в данном случае несущественно.
<?php 

$flags = array(
"PREG_PATTERN_ORDER",
"PREG_SET_ORDER",
"PREG_SET_ORDER|PREG_OFFSET_CAPTURE",
);


foreach ($flags as $name) {
$n=eval('return $name;');

echo gettype($n);
echo "\n<br>";
}
?>
Valick
Цитата
второй код должен быть таким

я знаю smile.gif
Цитата
Мне не понятно, почему eval в одном случае возвращает значение в int, а в другом string
Alex7777
Цитата (Valick @ 16.12.2014 - 10:18)
Цитата
второй код должен быть таким

я знаю smile.gif
Цитата
Мне не понятно, почему eval в одном случае возвращает значение в int, а в другом string

С простыми строками вроде все ясно, а с этим кодом опять впадаю в ступор.
Вы можете чуть подробнее объяснить как происходит замена переменной в eval в зависимости от вида кавычек в вышеприведенном коде?
Alchemist
в цикле переменная $name всегда является строкой, содержащей имя одной из констант или (в последнем случае) целое выражение. Вся сила в кавычках, брат...

в первом случае, поскольку кавычки двойные, интерпретатор подставляет значение переменной еще ДО отправки строки в eval(). Т.е. в первом случае код эквивалентен такому:
$n=eval('return PREG_PATTERN_ORDER;');
$n=eval('return PREG_SET_ORDER;');
$n=eval('return PREG_SET_ORDER|PREG_OFFSET_CAPTURE;');
соответственно в итоге $n каждый раз получает значение константы (или выражения).

во-втором случае, интерпретатор не рассматривает $name как переменную, и в eval() каждый раз отправляется одна и та же строка: 'return $name;' а значение $name проверяется уже при выполнении этого кода ВНУТРИ eval(). А поскольку, как писалось выше, $name при каждом проходе является строкой, то ты и получаешь в $n каждый раз строку "содержащую имя (а не значение) одной из констант." Т.е. код эквивалентен такому:
$n=eval('return "PREG_PATTERN_ORDER";');
$n=eval('return "PREG_SET_ORDER";');
$n=eval('return "PREG_SET_ORDER|PREG_OFFSET_CAPTURE";');
Alex7777
Цитата (Alchemist @ 16.12.2014 - 11:12)
в цикле переменная $name всегда является строкой, содержащей имя одной из констант или (в последнем случае) целое выражение. Вся сила в кавычках, брат...

в первом случае, поскольку кавычки двойные, интерпретатор подставляет значение переменной еще ДО отправки строки в eval(). Т.е. в первом случае код эквивалентен такому:
$n=eval('return PREG_PATTERN_ORDER;');
$n=eval('return PREG_SET_ORDER;');
$n=eval('return PREG_SET_ORDER|PREG_OFFSET_CAPTURE;');
соответственно в итоге $n каждый раз получает значение константы (или выражения).

во-втором случае, интерпретатор не рассматривает $name как переменную, и в eval() каждый раз отправляется одна и та же строка: 'return $name;' а значение $name проверяется уже при выполнении этого кода ВНУТРИ eval(). А поскольку, как писалось выше, $name при каждом проходе является строкой, то ты и получаешь в $n каждый раз строку "содержащую имя (а не значение) одной из констант." Т.е. код эквивалентен такому:
$n=eval('return "PREG_PATTERN_ORDER";');
$n=eval('return "PREG_SET_ORDER";');
$n=eval('return "PREG_SET_ORDER|PREG_OFFSET_CAPTURE";');

Вот теперь понял, спасибо Вам Alchemist!
volter9
Цитата (Alchemist @ 16.12.2014 - 11:12)
в цикле переменная $name всегда является строкой, содержащей имя одной из констант или (в последнем случае) целое выражение. Вся сила в кавычках, брат...

в первом случае, поскольку кавычки двойные, интерпретатор подставляет значение переменной еще ДО отправки строки в eval(). Т.е. в первом случае код эквивалентен такому:
$n=eval('return PREG_PATTERN_ORDER;');
$n=eval('return PREG_SET_ORDER;');
$n=eval('return PREG_SET_ORDER|PREG_OFFSET_CAPTURE;');
соответственно в итоге $n каждый раз получает значение константы (или выражения).

во-втором случае, интерпретатор не рассматривает $name как переменную, и в eval() каждый раз отправляется одна и та же строка: 'return $name;' а значение $name проверяется уже при выполнении этого кода ВНУТРИ eval(). А поскольку, как писалось выше, $name при каждом проходе является строкой, то ты и получаешь в $n каждый раз строку "содержащую имя (а не значение) одной из констант." Т.е. код эквивалентен такому:
$n=eval('return "PREG_PATTERN_ORDER";');
$n=eval('return "PREG_SET_ORDER";');
$n=eval('return "PREG_SET_ORDER|PREG_OFFSET_CAPTURE";');

Низкий поклон Вам, Alchemist smile.gif
Но как вы догадались что во втором примере апостроф? Ведь код абсолютно одинаковый в оригинальном посте (в обоих случаях кавычки).

_____________
Мой блог
Valick
Цитата
Но как вы догадались что во втором примере апостроф?

ну во первых странно что вы не догадались, а во вторых весь топик я так понимаю вы не читали smile.gif

_____________
Стимулятор ~yoomoney - 41001303250491
Alchemist
Цитата (Alex7777 @ 16.12.2014 - 09:21)
Но как вы догадались что во втором примере апостроф? Ведь код абсолютно одинаковый в оригинальном посте (в обоих случаях кавычки).

Способности к чтению мыслей появляются примерно через год активного пребывания на форуме, у кого-то раньше, у кого-то позже. Многие просидевшие тут больше 2х лет, с легкостью определяют на растоянии не только что именно хотел сделать ТС, но и его нац. принадлежность (индус), рабочий стаж и даже имя учителя.

А на 3-4 году появляется способность к прорицанию...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.