Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2010, 22:54   #1
akokin
Пользователь
 
Регистрация: 02.08.2008
Сообщений: 94
По умолчанию Операция сравнения: требуется разъяснение

Вот еще один пример для меня необъяснимый и нигде не могу найти точного пояснения.
Код:
$a = 0;
if ("$a" == "") echo "Есть равенство";
Что здесь с чем сравнивается?
Я рассуждаю так (может быть ошибаюсь): значение переменной $a равно 0. В PHP все, что находится в двойных кавычках интеполируется. Значит, в операнде "$a" должно быть 0. Пустая строка "" тоже трактуется сначала как 0, а потом как false.
Таким образом, должно быть равенство (по моей логике), а это не так.
В чем я ошибаюсь и как PHP интерпретирует данное сравнение?
Буду очень благодарен за пояснения.
Спасибо.
akokin вне форума Ответить с цитированием
Старый 22.01.2010, 23:19   #2
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

По-моему, проблема в первых кавычках в скобке. Если их убрать, то равенство есть. А если они есть, то первая часть выражения воспринимается как строка длиной 1 со значением 0, и она не равна пустой строке.
motorway вне форума Ответить с цитированием
Старый 22.01.2010, 23:22   #3
akokin
Пользователь
 
Регистрация: 02.08.2008
Сообщений: 94
По умолчанию

Получается, здесь (в операции сравнения) не действует общее правило интерполирования?
akokin вне форума Ответить с цитированием
Старый 22.01.2010, 23:25   #4
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Почему? Вы имеете в виду интерпретирования, а не интерполирования?
Здесь если оставить кавычки первые, то будет считаться строкой, и все правильно - строки не одинаковы. А так это будут нули, и будет равенство.

Вообще есть таблица http://www.php.net/manual/en/languag...comparison.php, может, поможет чем-то...
motorway вне форума Ответить с цитированием
Старый 22.01.2010, 23:32   #5
akokin
Пользователь
 
Регистрация: 02.08.2008
Сообщений: 94
По умолчанию

Я имел в виду именно интерполирование. Вот что написано в учебнике Котерова:
Цитата:
...переменные в строках, заключенных в кавычки, интерполируются, т.е. расширяются.
В данном случае и должна происходить интерполяция, либо же преобразование в число (из той же таблицы по вашей ссылке (спасибо)).
Но не происходит. Вопрос: почему?
akokin вне форума Ответить с цитированием
Старый 22.01.2010, 23:36   #6
spein
Программист
Форумчанин
 
Аватар для spein
 
Регистрация: 27.02.2009
Сообщений: 505
По умолчанию

В условиях это не работает
В условиях надо if ($a == "") ...
Работает в тексте
echo "num, $a"'
there are no limits when you're software engineer
spein вне форума Ответить с цитированием
Старый 22.01.2010, 23:37   #7
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Для меня ясно, что в случае с "$a" и "" это сравниваются две переменных типа строка, так что преобразований типов не происходит. Оно происходит в случае первом. Про интерполирование я не слышал, но это не так важно - в принципе, это можно воспринимать как данность или условное соглашение языка.
motorway вне форума Ответить с цитированием
Старый 23.01.2010, 10:37   #8
akokin
Пользователь
 
Регистрация: 02.08.2008
Сообщений: 94
По умолчанию

Верный ответ: в данном случае это строки и они сравниваются как строки. Интерполирование все же для "$a" происходит и 0 оказывается в кавычках как строка. Строки сравниваются побайтно и поэтому операция сравнения возвращает false.
akokin вне форума Ответить с цитированием
Старый 25.01.2010, 12:24   #9
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Сообщение от akokin Посмотреть сообщение
Цитата:
...переменные в строках, заключенных в кавычки, интерполируются, т.е. расширяются.
Профессор Преображенский сказал бы: "В печку её!" При сравнении переменные приводяться к одному типу по строго опредёленным правилам и никакой интерполяции там нет и быть не может! А расширение переменных это вообще что - новое явление в газовой динамике?
Цитата:
Сообщение от akokin Посмотреть сообщение
Верный ответ: в данном случае это строки и они сравниваются как строки.
Чтобы впоследствии не было вопросов обьясняю.
PHP код:
$a 0;
if (
"$a== "") echo "Есть равенство"
Если строка "0" равна строке "" то... Тип переменной находящейся справа от знака равенства приводиться к типу переменной слева. Здесь приведения не идёт вообще, и строка с символом 0 не может быть равна пустой строке. Соотвественно если кавычек не будет
PHP код:
if ($a == ""
то пустая строка будет приведена к числу 0.
Стрелок-охотник

Последний раз редактировалось mv28jam; 25.01.2010 в 12:55.
mv28jam вне форума Ответить с цитированием
Старый 25.01.2010, 19:52   #10
akokin
Пользователь
 
Регистрация: 02.08.2008
Сообщений: 94
По умолчанию

Цитата:
Сообщение от mv28jam Посмотреть сообщение
А расширение переменных это вообще что - новое явление в газовой динамике?
Это даже не мои слова, а из книги "PHP 5 в подлиннике" от Котерова.

Цитата:
Чтобы впоследствии не было вопросов обьясняю.
PHP код:
$a 0;
if (
"$a== "") echo "Есть равенство"
Если строка "0" равна строке "" то... Тип переменной находящейся справа от знака равенства приводиться к типу переменной слева. Здесь приведения не идёт вообще, и строка с символом 0 не может быть равна пустой строке. Соотвественно если кавычек не будет
PHP код:
if ($a == ""
то пустая строка будет приведена к числу 0.
За объяснение спасибо, но получается, что вы только что интерполировали переменную $a.
akokin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
операция SHL Anohorett Общие вопросы C/C++ 2 02.12.2009 23:27
разъяснение кода БД Ежедневника на Delphi TaYgA Помощь студентам 1 19.10.2009 17:33
Операция в Газе Роман Радер Свободное общение 2 31.12.2008 17:03
структура моей бд. Нужно разъяснение. Roof Microsoft Office Access 1 27.12.2008 18:23
Операция Ы SASHA50 Microsoft Office Excel 10 25.04.2008 12:38