Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Странное поведение empty,да и пхп в целом =)
Функция при проверке работает верно (и при проверке переменной и при проверке элемента массива), но стоит проверить при экранировании ({}) проверка работает только на переменной,но не на элементе массива (т.е. всегда будет правда).
Может я что не так делаю? )
UPD: Каюсь, зря я функцию вмешал,она не причем. Не верно либо написание кода,либо действия интерпретатора.
Код
По идее должно вывести test,но ошибка Undefined variable .
А теперь, если вспомнить ошибку отсутствия элемента то выводилось Undefined index ... и т.д.
Т.е. Экранируемое в {} воспринимается полностью как название переменной,а не переменной с указанием элемента массива .
Покинул форум
Сообщений всего: 177
Дата рег-ции: Июль 2010 Откуда: Ukraine::Kiev
Помог: 1 раз(а)
eval() рул =)))
JustUserR
Отправлено: 11 Августа, 2010 - 01:51:58
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Монстр_11111 пишет:
По идее должно вывести test,но ошибка Undefined variable
На самом деле в приведенном вами примере PHP-кода происходит достаточно обычная обработка переменной с динамическим именем по общим правилам - однако несовпадения реальных результатов выполнения в возможными ожиданя происходит по несколько иной причине - которая заключается в том что интерполяция значений переменных происходит только при обработке первого уровня - и не рассчитывается для внутренних вложений - даже если соответствующая подстановка получается в исходном представлении некоторой строки в момент ее использования в качестве динамического индекса
Конкретно в вашем случае выполнение происходит следующим образом - в выражении echo ${$var['x']} считывается значение переменной $var['x'] и ее содержимое используется в качестве динамического индекса для расчитываемого имени переменной - то есть получается выражение ${"var[x2]"} которое к тому же содержит недопустимое имя переменной И даже если в данному подставляемому значению предварительно добавить знак доллара с необходимым уровнем экранирования - то ситуация не изменится и будет происходить дословная обработка выражения ${"$var[x2]"} без последующей интерполяции
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Монстр_11111
Отправлено: 11 Августа, 2010 - 11:43:52
Частый гость
Покинул форум
Сообщений всего: 248
Дата рег-ции: Нояб. 2009
Помог: 0 раз(а)
JustUserR, ты так красиво сказал то что я уже понял - что это не работает )
Такс, как тогда вызвать переменную (в том числе и массив) из строки ? Есть ли какой нибудь вариант?
DeepVarvar
Отправлено: 11 Августа, 2010 - 14:45:41
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Монстр_11111 пишет:
JustUserR, ты так красиво сказал то что я уже понял - что это не работает )
Такс, как тогда вызвать переменную (в том числе и массив) из строки ? Есть ли какой нибудь вариант?
В приведенном мной выше сообщении была описана схема интерполяции строк и использования динамических идентификаторов имен переменных в PHP - на основе этих данных можно создать действенное решение Основной причиной по которой возникла проблема в вашей задача является то - что те строковые данные которые находятся в строковых константах в исходном коде и те которые рассчитываются динамически во время выполнения - несколько по-разному работают с интерполяцией значения даже при изменении текущего уровня экранирования
Конерктно возникает такая ситуация - сначала вы используете одну строку являющуюся константой в которую должно интерполироваться значение другой из них - а потом вы повторяете аналогичное вложение еще для одной стороковой переменной Однако двойной подстановки осуществляться не будет - и в конечном счете в ней окажется имя переменной от подставновки первого уровня Причина такой работы интерпретатора PHP достаточно проста - все дело в том что встречающиеся в коде выражения вычисляются сразу по мере их обработки - и не возвращается к предыдущему коду для реализации вложенных подстановок
Конкретно к вашему случаю это ограничение можно сформулировать таким образом - в качестве идентификатора для динамической переменной можно использовать имя другой переменной которая будет его содержать - но максимально допустимый уровень ее записи уже не может содержать кавычек - в то время как в вашем случа "var['x2']" находится физически в кавычках
Далее я могу привести примеры - каким образом реально происходит вычисление приведенных вами выражений
$var['x']="\$var['x2']";// Переменной $var['x'] значение которой используется в качестве имени динамической переменной присваивается некоторая строка
echo ${$var['x']};// Попытка обращения к переменной $var['x2'] - способ похож на истинный но вторичная интерполция во внутренеем представлении сторки не соверашется
В качестве универсального конечно же можно использовать функцию eval и ее вложенные последовательные вызовы - в таком случае можно внучную указать уровень требуемого исполнения и осуществиь поэтапную вложенную интерполяцию
$var['x']="var['x2']";// Переменной $var['x'] значение которой используется в качестве имени динамической переменной присваивается некоторая строка
eval("\$n=\$".$var['x'].";");// Выполняем вручную один этап интерполяции - причем здесь в качестве имени динамической переменной может выступать не только допустимый идентификатор - но и некоторое генерирующее выражение
echo$n;// Вывоз значения test - как и требовалось первоначально
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Монстр_11111
Отправлено: 16 Августа, 2010 - 15:53:18
Частый гость
Покинул форум
Сообщений всего: 248
Дата рег-ции: Нояб. 2009
Помог: 0 раз(а)
JustUserR Очередной раз Огромное спасибо !
Да и собственно спасибо всем кто отозвался в этой теме
JustUserR
Отправлено: 17 Августа, 2010 - 02:43:15
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Монстр_11111 пишет:
JustUserR Очередной раз Огромное спасибо !
Пожалуйста! Кроме того если рассматривать реализацию доступа к динамическим именам переменных определяемых выражением которое генерирует допустимый идентификатор - то можно к примеру использовать ООП и специальные обрабатывающие функции __set/__get внутри которых указанное выражение будет анализироваться и преобразовываться в требуемое имя
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.