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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему "abc"==0, задачка на понимание типов 
:(
    Опции темы
Feldmarschall
Дата 16.12.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Модератор зачем-то закрыл интересную тему.
Я бы хотел её продолжить.
Итак, условия задачи:
Нам надо проверить, есть ли в переменной какой-нибудь текст.
Мы имеем 4 варианта проверки:
$var==""
$var==0
!$var
emtry($var)

Вопрос.
Что вернут эти проверки при наличии в переменной текста "abc", и почему?
что вернут, если $var равна пустой строке, и почему?
Если $var равна 1?
Если $var равна нулю?



PM   Вверх
Lexxx_HU
Дата 16.12.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а не легче это все на прямых примерах .. вписать в файл .. и запустить его на сервере ..
сразу все сомнения отпадут
PM MAIL   Вверх
Fin
Дата 16.12.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


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

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



Тут не нужно гадать. Читаем мануал http://il2.php.net/manual/ru/language.type...pes.typecasting и http://il2.php.net/manual/ru/types.comparisons.php

Это сообщение отредактировал(а) Fin - 16.12.2007, 22:22


--------------------
Пролетал мимо.
PM MAIL   Вверх
Feldmarschall
Дата 16.12.2007, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Lexxx_HU, в том то и дело, что не легче.
Запуск скрипта на сервере не прибавит понимания - почему так происходит.
PM   Вверх
flashaa
Дата 16.12.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У типов есть приоритет. У булева типа самый высокий приоритет, далее идет строка, потом число. Например когда сравниваешь булеву переменную с чем-то, то это "что-то" преобразуется к булю. Если сравниваешь строку и число, то число преобр. в строку. При преобразовании числа в строку оно становится тем же самым числом, то в кавычках. При преобразовании к булеву типу, все что не равно нулю и не пустая строка становится true. Вообщем-то следствием этих правил является таблица type comparisons, которую тут привели.

Ну есть несколько правил, таких как число 0 преобразуется не в строку "0" а в пустую строку. 

Это относится к оператору "==", т.к. он преобразует типы.

Это сообщение отредактировал(а) flashaa - 16.12.2007, 23:28
PM MAIL   Вверх
Feldmarschall
Дата 16.12.2007, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



А к оператору отрицания - !, не относится? ;-)

Цитата(flashaa @  16.12.2007,  23:27 Найти цитируемый пост)
Если сравниваешь строку и число, то число преобр. в строку.

у автора предыдущей темы получилось совсем по-другому - строка превратилось в число.

Это сообщение отредактировал(а) Feldmarschall - 16.12.2007, 23:49
PM   Вверх
flashaa
Дата 16.12.2007, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Feldmarschall @  16.12.2007,  23:33 Найти цитируемый пост)
А к оператору отрицания - !, не относится? ;-)

Да, забыл про воскл. знак.
Отрицание, как и некоторые другие операторы, специфичен для своего типа. Следовательно он пытается привести свой аргумент к "своему" типу.
Восклицательный знак пытается привести к булю, echo - к строке, математические операторы, соотвественно, к числу.. Это в общих чертах, т.к. плюс например с разными типами работает, там логика не столь прямолинейна. А воскл знак прост - он всегда кастует к булю.

Это сообщение отредактировал(а) flashaa - 16.12.2007, 23:43
PM MAIL   Вверх
Feldmarschall
Дата 17.12.2007, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Про приоритет типов ничего не нашел в документации. Только строчку про то, что если число сравнивается со строкой, то строка Приводится к числу, а не наоборот. Возможно, это какой-то аналог приоритетов, а возможно - следствие того, что строковые числа распознаются и так, а строки, начинающиеся с чисел - перевдятся в число. 
PM   Вверх
flashaa
Дата 17.12.2007, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Feldmarschall @  17.12.2007,  00:03 Найти цитируемый пост)
Про приоритет типов ничего не нашел в документации.

аналогично.  То что я писал - результат чтения аналогичной главы в книге про JS(там про это есть четкий регламент) + результат научного тыка на практике.
Цитата(Feldmarschall @  17.12.2007,  00:03 Найти цитируемый пост)
Если число сравнивается со строкой, то строка Приводится к числу

думаю,что так. Посмотрел

('abc' == 0) - true, а если идти по моей логике должно быть false.
PM MAIL   Вверх
Feldmarschall
Дата 17.12.2007, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Мда. И это мы только с непустой строкой разобрались =)
С остальным, правда, вроде легче. Ну, кроме того, что на введенный в форму ноль (процент по кредиту, например) empty нас завернёт.
Пожалуй, надо действительно, только запомнить, что число кастуется в строку по принципу если есть вначале цифры - то они, а если нет - то ноль.

А для решения задачки "введено ли что-то в форму", использовать... strlen()!
PM   Вверх
Mal Hack
Дата 17.12.2007, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(Feldmarschall @  16.12.2007,  22:04 Найти цитируемый пост)
Что вернут эти проверки при наличии в переменной текста "abc", и почему?
что вернут, если $var равна пустой строке, и почему?
Если $var равна 1?
Если $var равна нулю?

Нормальные люди берут и проверяют что скрипт вернет, делают, так называемый "псведо-тестовый вывод" системной (в данном случае получаемой в результате проверки) информации...
А то простите, можно всю жизнь себя спрашивать: "а какогО ЭТО в первый раз?" (я надеюсь все поняли, что я про написание первого 100% рабочего скрипта).
Цитата(Feldmarschall @  16.12.2007,  22:22 Найти цитируемый пост)
Запуск скрипта на сервере не прибавит понимания - почему так происходит. 

Для понимания почему так происходит надо ознакомиться с теорией компиляторов (тут не придираться к тому, что ПХП - интерпретатор, имеется ввиду общая теория построения машинного кода из исходного), с исходниками самого ПХП и Си функций лежащих в основе. Только так.
Цитата(Feldmarschall @  17.12.2007,  00:03 Найти цитируемый пост)
Про приоритет типов ничего не нашел в документации. Только строчку про то, что если число сравнивается со строкой, то строка Приводится к числу, а не наоборот. Возможно, это какой-то аналог приоритетов, а возможно - следствие того, что строковые числа распознаются и так, а строки, начинающиеся с чисел - перевдятся в число.  

Приоритеты с типами не связаны. Видимо на строгом, по части типов, языке вы не программировали, посему разъясняю. Приоритет - это как в математике, сначала функция (синус, например), затем умножение, потом сложение, и никак иначе. Что касается типов. Когда ПХП видит, что горе программист пытается сравнить строку с числом или булево число со строкой, он САМ пытается преобразовать один из типов, который не является константным выражением в другой тип, с которым идет сравнение... В любом другом языке вы получили бы ошибку компилляции.
PM ICQ   Вверх
SelenIT
Дата 17.12.2007, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



Имхо, главное преимущество проверки через empty() - отсутствие ругани на неустановленную переменную smile, избавляющее от нудных проверок на isset. За это в большинстве практических случаев ей можно простить неадекватную (с точки зрения человека, воспитанного на типизированных языках) реакцию на строковый ноль. Если же разница между вариантами empty-значений становится ощутимой (как в примере с калькулятором кредита-из-мечты ;) - то, имхо, это уже особый случай, который так или иначе приходится разруливать более сложным алгоритмом валидации значения (isset + is_numeric, isset + проверка по маске и т.п.).


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Feldmarschall
Дата 17.12.2007, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Mal Hack, это всё общие рассуждения, не отвечающие на главный вопрос - "почему". Почему конкретно "abc"==0.
Да, PHP САМ пытается преобразовать один из типов. Но интересно же - почему он преобразовывает строку к числу, а не наоборот smile


PM   Вверх
SelenIT
Дата 17.12.2007, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



Цитата(Feldmarschall @  17.12.2007,  00:29 Найти цитируемый пост)
только запомнить, что число кастуется в строку по принципу если есть вначале цифры - то они, а если нет - то ноль

Наверное, только наоборот - "строка в число"? А в остальном - как-то так...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
flashaa
Дата 17.12.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Mal Hack @  17.12.2007,  01:30 Найти цитируемый пост)
Приоритеты с типами не связаны.


Цитата(Mal Hack @  17.12.2007,  01:30 Найти цитируемый пост)
Когда ПХП видит, что горе программист пытается сравнить строку с числом или булево число со строкой, он САМ пытается преобразовать один из типов, который не является константным выражением в другой тип, с которым идет сравнение..

Да это не защита от горе программистов, это политика слабо-типизированных языков. Если бы хотели защититься от мишуры с типами, сделали бы PHP четко типизированным.


Цитата(Feldmarschall @  17.12.2007,  09:48 Найти цитируемый пост)
Почему конкретно "abc"==0.
Да, PHP САМ пытается преобразовать один из типов. Но интересно же - почему он преобразовывает строку к числу, а не наоборот

Да, меня тоже слегка это сбило, в JS число преобразуется к строке и по-моему это весьма логично. Поэтому сорри за небольшую дезинформацию о приоритетах PHP.

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.

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


 




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


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

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