Глюк в PHP

Тема в разделе "PHP", создана пользователем horpah, 8 июн 2011.

Модераторы: latteo
  1. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    Собственно сабж:
    PHP:
    $z='ddd';
    $x=(int) $z;
    echo 
    $z.'<br>'//ddd
    echo $x.'<br>'// 0


    if($x==$z){
       echo 
    'fuck'// оказывается они равны :)
    }
    Это фишка или глюк? Версия 5.2.13 под win32
     
  2. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    при сравнении интерпритатор php автоматом преобразует обе переменные к одному типу.

    тройное равно попробуй

    PHP:
    <?
    $z='ddd'
    $x=(int) $z
    echo 
    $z.'<br>'//ddd 
    echo $x.'<br>'// 0 


    if($x===$z){ 
       echo 
    'fuck'// оказывается они равны :) 
    } else echo 'fig vam :)';

    ?>
     
  3. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    PHP:
    if ('ddd' == 0) echo "true";   // и даже так работает!
     
  4. DrakonHaSh

    DrakonHaSh

    Регистр.:
    29 июн 2010
    Сообщения:
    358
    Симпатии:
    122
    поэтому надо использовать === и !==
    if ('ddd' === 0) echo "true ===";
    if ('ddd' !== 0) echo "true !==";
     
  5. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    PHP:
    if ('aaa' == true) echo 1;
    if (
    'aaa' == 0) echo 2;
    if (
    == false) echo 3;
    Это не глюк, а приведение типов.
    Когда происходит что-то типа parseInt('aaa') - тогда и получается ноль, и сравнение с другим нулем дает, соответственно, true.

    А вот почему при сравнивании int и boolean оно приводит все к boolean, а не к int - я лично не понимаю.

    От порядка аргументов не зависит.

    Есть что ли какой-то приоритет типов?
     
  6. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    возможно всё автоматом приводится к наименее обширному типу

    а может быть при сравнении оно ещё сравнивает типы после автоматического их преобразования в один :)

    типа одно булеан и другое булеан и в этом они равны, вот вам и true

    я когда то давно пол часа кампасировал себе и гуглу мозг, не мог понять почему скрипт не работает. С тех пор везде где это уместно использую только === :D

    === - равное и по типу и по значению
     
  7. PHPCod3r

    PHPCod3r

    Регистр.:
    7 июн 2010
    Сообщения:
    261
    Симпатии:
    25

    Вот есть замечательная таблица по этому поводу
    http://ru2.php.net/manual/en/types.comparisons.php
    и это стоит всегда иметь ввиду когда используещь == или ===

    А вообще в пхп всего 8 типов данных и он с ними очень лихо работает
    вот материал 0 уровня, для начального ознокомления
    http://ru2.php.net/manual/en/language.types.type-juggling.php
     
    horpah нравится это.
  8. zzzkabanzzz

    zzzkabanzzz Создатель

    Регистр.:
    15 июн 2011
    Сообщения:
    56
    Симпатии:
    4
    На 5.3 вроде все ок! Даже при == !!!!