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,да и пхп в целом =)

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Монстр_11111
Отправлено: 10 Августа, 2010 - 23:04:52
Post Id



Частый гость


Покинул форум
Сообщений всего: 248
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




Здраствуйте, думаю всем знакома функция empty
Так вот, она не совсем верно работает с конструкцией экранирования вместе с .. бла бла .
В общем код )
PHP:
скопировать код в буфер обмена
  1.  
  2. $var['x'] = "test";
  3. //$var['x'] = "var['x']";
  4. if ( empty(${$var['x']}) )
  5.         echo 'TRUE'.$var['x'];
  6.  

Функция при проверке работает верно (и при проверке переменной и при проверке элемента массива), но стоит проверить при экранировании ({}) проверка работает только на переменной,но не на элементе массива (т.е. всегда будет правда).
Может я что не так делаю? )

UPD: Каюсь, зря я функцию вмешал,она не причем. Не верно либо написание кода,либо действия интерпретатора.
Код
PHP:
скопировать код в буфер обмена
  1.  
  2. $var['x2'] = "test";
  3. $var['x'] = "var['x2']";
  4. echo ${$var['x']};
  5.  

По идее должно вывести test,но ошибка Undefined variable .
А теперь, если вспомнить ошибку отсутствия элемента то выводилось Undefined index ... и т.д.
Т.е. Экранируемое в {} воспринимается полностью как название переменной,а не переменной с указанием элемента массива .

(Отредактировано автором: 10 Августа, 2010 - 23:32:51)

 
 Top
Arch-Web
Отправлено: 11 Августа, 2010 - 00:31:58
Post Id



Частый гость


Покинул форум
Сообщений всего: 177
Дата рег-ции: Июль 2010  
Откуда: Ukraine::Kiev


Помог: 1 раз(а)




eval() рул =)))
 
 Top
JustUserR
Отправлено: 11 Августа, 2010 - 01:51:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 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/
 
 Top
Монстр_11111
Отправлено: 11 Августа, 2010 - 11:43:52
Post Id



Частый гость


Покинул форум
Сообщений всего: 248
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




JustUserR, ты так красиво сказал то что я уже понял - что это не работает )

Такс, как тогда вызвать переменную (в том числе и массив) из строки ? Есть ли какой нибудь вариант?
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Августа, 2010 - 14:45:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. #
  2. $var['x2'] = "test";
  3. $bypass = $var['x'] = "var['x2']";
  4. echo ${$bypass};

Может быть так???
(Добавление)
Если будут использоваться массивы, то вывернуться можно циклом, но всеравно через "байпасЫ" )))
 
 Top
JustUserR
Отправлено: 12 Августа, 2010 - 01:12:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Монстр_11111 пишет:
JustUserR, ты так красиво сказал то что я уже понял - что это не работает )
Такс, как тогда вызвать переменную (в том числе и массив) из строки ? Есть ли какой нибудь вариант?
В приведенном мной выше сообщении была описана схема интерполяции строк и использования динамических идентификаторов имен переменных в PHP - на основе этих данных можно создать действенное решение Основной причиной по которой возникла проблема в вашей задача является то - что те строковые данные которые находятся в строковых константах в исходном коде и те которые рассчитываются динамически во время выполнения - несколько по-разному работают с интерполяцией значения даже при изменении текущего уровня экранирования
Конерктно возникает такая ситуация - сначала вы используете одну строку являющуюся константой в которую должно интерполироваться значение другой из них - а потом вы повторяете аналогичное вложение еще для одной стороковой переменной Однако двойной подстановки осуществляться не будет - и в конечном счете в ней окажется имя переменной от подставновки первого уровня Причина такой работы интерпретатора PHP достаточно проста - все дело в том что встречающиеся в коде выражения вычисляются сразу по мере их обработки - и не возвращается к предыдущему коду для реализации вложенных подстановок
Конкретно к вашему случаю это ограничение можно сформулировать таким образом - в качестве идентификатора для динамической переменной можно использовать имя другой переменной которая будет его содержать - но максимально допустимый уровень ее записи уже не может содержать кавычек - в то время как в вашем случа "var['x2']" находится физически в кавычках
Далее я могу привести примеры - каким образом реально происходит вычисление приведенных вами выражений
PHP:
скопировать код в буфер обмена
  1. $var['x2'] = "test";
  2. $var['x'] = "var['x2']"; // Переменной $var['x'] значение которой используется в качестве имени динамической переменной присваивается некоторая строка
  3. echo ${$var['x']}; // Попытка обращения к переменной var['x2'] - вообще синтаксически неверно  
PHP:
скопировать код в буфер обмена
  1. $var['x2'] = "test";
  2. $var['x'] = "\$var['x2']"; // Переменной $var['x'] значение которой используется в качестве имени динамической переменной присваивается некоторая строка
  3. echo ${$var['x']}; // Попытка обращения к переменной $var['x2'] - способ похож на истинный но вторичная интерполция во внутренеем представлении сторки не соверашется  

В качестве универсального конечно же можно использовать функцию eval и ее вложенные последовательные вызовы - в таком случае можно внучную указать уровень требуемого исполнения и осуществиь поэтапную вложенную интерполяцию
PHP:
скопировать код в буфер обмена
  1. $var['x2'] = "test";
  2. $var['x'] = "var['x2']"; // Переменной $var['x'] значение которой используется в качестве имени динамической переменной присваивается некоторая строка
  3. eval("\$n=\$".$var['x'].";"); // Выполняем вручную один этап интерполяции - причем здесь в качестве имени динамической переменной может выступать не только допустимый идентификатор - но и некоторое генерирующее выражение
  4. echo $n; // Вывоз значения test - как и требовалось первоначально  


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Монстр_11111
Отправлено: 16 Августа, 2010 - 15:53:18
Post Id



Частый гость


Покинул форум
Сообщений всего: 248
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




JustUserR Очередной раз Огромное спасибо !
Да и собственно спасибо всем кто отозвался в этой теме
 
 Top
JustUserR
Отправлено: 17 Августа, 2010 - 02:43:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Монстр_11111 пишет:
JustUserR Очередной раз Огромное спасибо !
Пожалуйста! Кроме того если рассматривать реализацию доступа к динамическим именам переменных определяемых выражением которое генерирует допустимый идентификатор - то можно к примеру использовать ООП и специальные обрабатывающие функции __set/__get внутри которых указанное выражение будет анализироваться и преобразовываться в требуемое имя


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB