[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сравнение типов
Boolean_Type
Всем здравствуйте!
Разбираюсь с преобразованием типов (пока для примитивов):
1) при сравнении number == null к какому типу будут приведены операнды до выдачи результата - к булевому или числовому?
Отличная статья по этой ссылке:
http://sldn.softlayer.com/blog/dmcaloon/PH...ions-Comparison
...гласит, что к булевому (см. таблицу), но в учебнике Котерова написано, что, если один из операндов - число, "сравнение всегда выполняется в числовом контексте, даже если второй операнд — не число." ;

2) при сравнении string == number операнды преобразовываются к числу. К какому типу - integer или float?
Игорь_Vasinsky
число это число
строка это строка
булевый тип это булевый тип

для сравнивая значений ==
для сравнивания типов ===

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
linker
Приводиться будет только один операнд, который строка. NULL ни к чем не приводится, поэтому в обоих случаях результат сравнения false. И как тебе уже сказали, если сравниваешь типы, то используй ===

_____________
Gear Framework
Gear Framework на Github
Boolean_Type
Цитата (linker @ 9.04.2014 - 09:02)
NULL ни к чем не приводится

Но ведь, насколько я знаю, для того чтобы сравнить два значения, их нужно для начала привести к одному типу, чтобы потом доложить, true это или false. Так, сравнение строки и null преобразует опа операнда к строке:
null == '0' //false, null преобразовывается в пустую строку, "0" - непустая строка, так что строка "" не равна строке "0".
Ссылка (см. в таблице): http://sldn.softlayer.com/blog/dmcaloon/PH...ions-Comparison
При сравнении строки и null эти два операнда также должны приводиться к одному типу, иначе как же их сравнивать?
inpost
А зачем одну и ту же ссылку дублировать? Ты владелец того сайта и пиаришь таким образом себя? :ph34r:

Сравнение с null действует так. Почитай:
http://us3.php.net/manual/ru/types.comparisons.php

А какой тип к какому, то сделай простую проверку:
if(16 == (int)'16aaaa')
и
if(16 == '16aaaa')


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Игорь_Vasinsky
Цитата
насколько я знаю, для того чтобы сравнить два значения, их нужно для начала привести к одному типу


гы.

уже писали - если сравнивают значения - то сравнивают значения
если есть необходимость сравнить типы - то сравнивают типы

если у тебя

$a = 123;
$b = false;

то какой смысл сравнивать значения - если они РАЗНЫХ ТИПОВ

вообще - значения сравнивают - чтобы узнать - равны ли они (идентичны) или нет.

если сравнить число с булевым типом - это же понятно что они не идентичны - т.к. одно число, а другое булевый тип

))

тавтология, пардон.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Boolean_Type
Цитата (inpost @ 9.04.2014 - 14:09)
Сравнение с null действует так. Почитай:

Я уже читал 100500 раз этот раздел документации, но, как Вы, надеюсь, заметили, там нет ни слова о том, К КАКОМУ ЕДИНОМУ ТИПУ приводятся операнда ПРИ СРАВНЕНИИ.
Если уж и говорить о мануле, то по моему вопросу больше подходит др. таблица ("Сравнение различных типов"):
http://www.php.net/manual/ru/language.oper....comparison.php
Исходя из неё мне и не понятно, при сравнении [i]число == null[/i ] операнды преобразуется к булеву? Или к числу всё-таки? wacko.gif

П.с. Не имею ни малейшего отношения к тому сайту. Просто никто из отвечающих не взглянул, как устроена та таблица.
Boolean_Type
Цитата (Игорь_Vasinsky @ 9.04.2014 - 14:27)
какой смысл сравнивать значения - если они РАЗНЫХ ТИПОВ

Иногда неизвестно, какого типа исх. значение.
Boolean_Type
Ну серьёзно, мой вопрос не заключался в том, какой из операторов сравнения оптимальнее. Кину ещё ссылку из док-тации:
http://www.php.net/manual/ru/language.oper....comparison.php
Там последняя табл. - "Сравнение различных типов", где, в общем-то, написано, что к чему преобразуется при сравнении, просто я хочу уточнить относительно null. Судя по ней, null при сравнении с чем угодно (кроме строки) преобразуется в булево. Правильно?
linker
Boolean_Type
NULL не имеет вообще никакого значения, а потому и не может быть приведено к чему-то. Как строка не может быть приведена к NULL, потому что имеет определённое значение.

Хм... у если логически мыслить.

Хм... Был не прав.

_____________
Gear Framework
Gear Framework на Github
Игорь_Vasinsky
Цитата
Иногда неизвестно, какого типа исх. значение.

для этого и используют операторы сравнения - чтобы вывести на нужный тип или результат.

Цитата
null == '0' //false, null преобразовывается в пустую строку, "0" - непустая строка, так что строка "" не равна строке "0".


null - это null - это ничего

$var = null
;

переменная объявлена - но в ней ничего нет - даже пустоты, она просто инициализирована




/**
* Функция вернёт возраст клиента - если он мужик
*
@param string - пол клиента
*
@param int - год рождения клиента
*
@return mixed int, bool,string
*/


function getYears($sex, $db){
$this_year = 2012;
//Если мужик - то считаем
if($sex=='male'){
$years = $this_year - $db;
}
elseif($sex=='famale'){
//Женский пол тут мне не нужен нафиг
$years = false;
}
else{
$years = 'Какого пола тело???))';
}

return $years;
}


$years_old = getYears('male', 1954); //58 лет
//$years_old = getYears('famale', 1954); //Это девка..нам не важно скока ей лет
//$years_old = getYears('леший', 1954);//Какого пола тело???))


//с помощью штатных функций
if(is_numeric($years_old))
echo 'Клиенту '.$years_old.' лет';
elseif(is_bool($years_old)){
echo 'Это девка..нам не важно скока ей лет';
}
else{
echo $years_old;
}



//Сравниваются числа
if(0<$years_old){
echo 'Клиенту '.$years_old.' лет';
}
//сравниваются булевые типы
elseif($years_old === false){
echo 'Это девка..нам не важно скока ей лет';
}
//Из 3х вариантов типов - остаётся - строка
else{
echo $years_old;
}


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.