На Главную

Гибкое сравнение типов в PHP

December 14th, 2007 by Yuriy Drozdov

Как Вы думаете, если выполнить код, который представлен ниже, что мы получим в результате?

PHP:
  1. <?php
  2.  
  3.     if ( 0 == 'php' )
  4.     {
  5.         echo 'Этого не может быть, они равны!';
  6.     }
  7.     else
  8.     {
  9.         echo 'Не равны!';
  10.     }
  11.  
  12. ?>

Сам спросил, сам отвечу :) . Данный скрипт выведет:

HTML:
  1. Этого не может быть, они равны!

Почему именно так? Да все просто, читаем.

Автор: Yuriy Drozdov

Похожие статьи:

  • Нет похожих статей

RSS комментариев | Trackback URI

15 Комментариев

Comment by Denix Subscribed to comments via email
2007-12-14 23:11:50

Не верьте ему, он уже пишет на Руби!
;)

Comment by y.drozdov
2007-12-18 14:51:24

Ложь и провокация!

 
 
Comment by anycolor Subscribed to comments via email
2007-12-14 23:49:27

Вообще-то для этого и придумали ===, чтобы не было таких граблей, как выше..

 
Comment by BOLK Subscribed to comments via email
2007-12-15 14:05:27

А что вас, собственно, тут смущает? Для того, чтобы программировать на языке, надо сначала прочитать руководство, а не использовать по принципу «вроде на Си похоже, значит и работает так же»

Comment by y.drozdov
2007-12-18 14:52:24

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

 
 
Comment by Vadim
2007-12-16 21:28:49

Вот собственно из-за таких вот прелестей жизнедеятельности и говорят что “php - это недоязык”, что “на нем пишут одни малолетние быдлокодеры”
IMHO - это явное проявление негатива от неявной типизации :)

 
Comment by Vadim
2007-12-16 21:30:51

P.S. Надо было дописать “НИКОГДА ТАК НЕ ДЕЛАЙТЕ” :)

 
Comment by anycolor Subscribed to comments via email
2007-12-17 19:49:35

Vadim, по-моему это не от “недоязыка”, а от нежелания читать мануалы и документацию. Причем тут типизация? Прямо все языки должны быть похожи друг на друга с одинаковой типизацией? Таким образом можно сказать, что если у программиста на с++ получилась утечка памяти, то виноват язык, потому, что не закрывает утечки, а не программист, что не прочитал документацию на должном уровне и не подумал о том, что нужно закрывать дырки с памятью.

Не мешайте зеленое с грязным..

 
Comment by Vadim
2007-12-17 22:09:21

От нежелания читать мануалы - это конечно же в первую очередь.
Это все равно что если бы в Java (какую вроде никто не называет “недоязыком”) сравнивать строки оператором “==”.
А вот непрозрачность приведения типов - это уже недочет языка.
Минус именно в том, что подобные типы вообще возникают.
Если мне не изменяет память, то за лет 5 активной разработки на PHP с подобными “граблями” сталкиваться не приходилось.

Comment by alex Subscribed to comments via email
2008-01-24 19:52:52

String s = “one”;
String p = “one”;
System.out.println(s == p);

И в чем проблема? ;)

Comment by Scratch613 Subscribed to comments via email
2008-01-24 20:38:47

Проблема в том, что это частный случай.
В данном примере джава-машина создаст _один_ объект, содержащий “one”. Так как это оптимизация уровня компиляции. На который и будут указывать s и p. Соответственно, они будут равны.

(на Java не пишу, увы, хотя и давно собираюсь)

 
Comment by Scratch613 Subscribed to comments via email
2008-01-24 20:39:40

Да, кстати, следует учесть, что s и p — это не строки.
Это указатели на строковые объекты :)

 
Comment by Scratch613 Subscribed to comments via email
2008-01-24 20:42:10

Ох, не удержусь и пропиарю (тем паче что в тему) —
http://voituk.kiev.ua/2007/12/01/just-another-java-internals-task/
Уважаемый Алекс, я думаю, вам стоит этот тест пройти :)

 
 
 
Comment by vladm Subscribed to comments via email
2007-12-25 12:16:56

А вот непрозрачность приведения типов - это уже недочет языка.

Не вижу непрозрачности, все в этом примере нормально, строка преобразовалась к числу как 0.

 
Comment by Scratch613 Subscribed to comments via email
2008-01-09 21:20:45

Ах, и ведь знал, почему так :)
И все равно — не поленился, полез в доку, прочитал :)
Шутник, в общем :)

 

Извините, комментарии закрыты.