Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Корректность выражения 
:(
    Опции темы
AnemoN
Дата 13.12.2012, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 16.4.2008

Репутация: нет
Всего: нет



Здравствуйте!

Небольшой вопрос по поводу работы интерпретатора с выражениями следующего вида:

Код

if ( !($var = func($option)) || isset($var['error']) ) {
  // ...
}


Собственно вопрос: гарантировано ли в подвыражении isset($var['error']) переменная $var уже будет содержать возвращенное функцией func значение?

Простой тест:

Код

$foo = -1;

if ( ($foo = 0) || !$foo )
{
  // ...
}


показывает что содержит, но если я кажется когда-то слышал что поведение в таком случае может быть непредсказуемым.
Может кому-то встречался конкретный док, разъясняющий этот момент?
PM MAIL   Вверх
Arantir
Дата 13.12.2012, 01:25 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Интерпретатор обрабатывает функции по приоритетам. Там, где приоритет равен - это последовательное выполнение слева направо (в случае логических функций). То есть, в случае ИЛИ: выполнить левую часть, выполнить правую часть, сравнить результаты через ИЛИ.

Интерпретатор не обрабатывает код дальше, если дошел до момента, когда логическое выражение гарантированно примет одно из возможных булевых значений.
То есть, после "false &&" уже нет смысла продолжать. Возможно это просто оптимизация, но благодаря этому весьма распространен и прекрасно существует такой код:
Код
if (isset($var) && $var == "val") { }

И не трудно убедится, что следующий код работать не будет (ошибка "Undefined variable"):
Код
if ($var == "val" && isset($var))

Вот этот код не выдаст ошибки:
Код
if ($some_var = true || $some_other_var == 0) { }
А этот выдаст:
Код

if ($some_var = false || $some_other_var == 0) { }


В вашем случае поведение вполне предсказуемо. Если $var будет равно true, то будет выполнено isset($var['error']), если нет - не будет выполнено. В обеих случаях $var будет присвоено значение до выполнения isset().

Добавлено @ 01:33
Вот док, вполне все разъясняющий:
http://php.net/manual/ru/language.operators.precedence.php


Это сообщение отредактировал(а) Arantir - 13.12.2012, 01:38


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
AnemoN
Дата 13.12.2012, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 16.4.2008

Репутация: нет
Всего: нет



Спасибо!

Угомонили мою паранойю
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.