![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Feldmarschall |
|
|||
|
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2641 Регистрация: 11.12.2007 Репутация: 22 Всего: 32 |
Модератор зачем-то закрыл интересную тему.
Я бы хотел её продолжить. Итак, условия задачи: Нам надо проверить, есть ли в переменной какой-нибудь текст. Мы имеем 4 варианта проверки: $var=="" $var==0 !$var emtry($var) Вопрос. Что вернут эти проверки при наличии в переменной текста "abc", и почему? что вернут, если $var равна пустой строке, и почему? Если $var равна 1? Если $var равна нулю? |
|||
|
||||
| Lexxx_HU |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 17.10.2006 Репутация: нет Всего: нет |
а не легче это все на прямых примерах .. вписать в файл .. и запустить его на сервере ..
сразу все сомнения отпадут |
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 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 -------------------- Пролетал мимо. |
|||
|
||||
| Feldmarschall |
|
|||
|
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2641 Регистрация: 11.12.2007 Репутация: 22 Всего: 32 |
Lexxx_HU, в том то и дело, что не легче.
Запуск скрипта на сервере не прибавит понимания - почему так происходит. |
|||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
У типов есть приоритет. У булева типа самый высокий приоритет, далее идет строка, потом число. Например когда сравниваешь булеву переменную с чем-то, то это "что-то" преобразуется к булю. Если сравниваешь строку и число, то число преобр. в строку. При преобразовании числа в строку оно становится тем же самым числом, то в кавычках. При преобразовании к булеву типу, все что не равно нулю и не пустая строка становится true. Вообщем-то следствием этих правил является таблица type comparisons, которую тут привели.
Ну есть несколько правил, таких как число 0 преобразуется не в строку "0" а в пустую строку. Это относится к оператору "==", т.к. он преобразует типы. Это сообщение отредактировал(а) flashaa - 16.12.2007, 23:28 |
|||
|
||||
| Feldmarschall |
|
|||
|
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2641 Регистрация: 11.12.2007 Репутация: 22 Всего: 32 |
||||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Да, забыл про воскл. знак. Отрицание, как и некоторые другие операторы, специфичен для своего типа. Следовательно он пытается привести свой аргумент к "своему" типу. Восклицательный знак пытается привести к булю, echo - к строке, математические операторы, соотвественно, к числу.. Это в общих чертах, т.к. плюс например с разными типами работает, там логика не столь прямолинейна. А воскл знак прост - он всегда кастует к булю. Это сообщение отредактировал(а) flashaa - 16.12.2007, 23:43 |
|||
|
||||
| Feldmarschall |
|
|||
|
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2641 Регистрация: 11.12.2007 Репутация: 22 Всего: 32 |
Про приоритет типов ничего не нашел в документации. Только строчку про то, что если число сравнивается со строкой, то строка Приводится к числу, а не наоборот. Возможно, это какой-то аналог приоритетов, а возможно - следствие того, что строковые числа распознаются и так, а строки, начинающиеся с чисел - перевдятся в число.
|
|||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
аналогично. То что я писал - результат чтения аналогичной главы в книге про JS(там про это есть четкий регламент) + результат научного тыка на практике.
думаю,что так. Посмотрел ('abc' == 0) - true, а если идти по моей логике должно быть false. |
|||
|
||||
| Feldmarschall |
|
|||
|
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2641 Регистрация: 11.12.2007 Репутация: 22 Всего: 32 |
Мда. И это мы только с непустой строкой разобрались =)
С остальным, правда, вроде легче. Ну, кроме того, что на введенный в форму ноль (процент по кредиту, например) empty нас завернёт. Пожалуй, надо действительно, только запомнить, что число кастуется в строку по принципу если есть вначале цифры - то они, а если нет - то ноль. А для решения задачки "введено ли что-то в форму", использовать... strlen()! |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 122 Всего: 261 |
Нормальные люди берут и проверяют что скрипт вернет, делают, так называемый "псведо-тестовый вывод" системной (в данном случае получаемой в результате проверки) информации... А то простите, можно всю жизнь себя спрашивать: "а какогО ЭТО в первый раз?" (я надеюсь все поняли, что я про написание первого 100% рабочего скрипта).
Для понимания почему так происходит надо ознакомиться с теорией компиляторов (тут не придираться к тому, что ПХП - интерпретатор, имеется ввиду общая теория построения машинного кода из исходного), с исходниками самого ПХП и Си функций лежащих в основе. Только так. Приоритеты с типами не связаны. Видимо на строгом, по части типов, языке вы не программировали, посему разъясняю. Приоритет - это как в математике, сначала функция (синус, например), затем умножение, потом сложение, и никак иначе. Что касается типов. Когда ПХП видит, что горе программист пытается сравнить строку с числом или булево число со строкой, он САМ пытается преобразовать один из типов, который не является константным выражением в другой тип, с которым идет сравнение... В любом другом языке вы получили бы ошибку компилляции. |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 32 Всего: 401 |
Имхо, главное преимущество проверки через empty() - отсутствие ругани на неустановленную переменную
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| Feldmarschall |
|
|||
|
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2641 Регистрация: 11.12.2007 Репутация: 22 Всего: 32 |
Mal Hack, это всё общие рассуждения, не отвечающие на главный вопрос - "почему". Почему конкретно "abc"==0.
Да, PHP САМ пытается преобразовать один из типов. Но интересно же - почему он преобразовывает строку к числу, а не наоборот |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 32 Всего: 401 |
Наверное, только наоборот - "строка в число"? А в остальном - как-то так... -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Да это не защита от горе программистов, это политика слабо-типизированных языков. Если бы хотели защититься от мишуры с типами, сделали бы PHP четко типизированным.
Да, меня тоже слегка это сбило, в JS число преобразуется к строке и по-моему это весьма логично. Поэтому сорри за небольшую дезинформацию о приоритетах PHP. |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |