Гибкое сравнение типов в PHP
December 14th, 2007 by Yuriy DrozdovКак Вы думаете, если выполнить код, который представлен ниже, что мы получим в результате?
PHP:
Сам спросил, сам отвечу . Данный скрипт выведет:
HTML:
-
Этого не может быть, они равны!
Почему именно так? Да все просто, читаем.
Похожие статьи:
- Нет похожих статей
Не верьте ему, он уже пишет на Руби!
;)
Ложь и провокация!
Вообще-то для этого и придумали ===, чтобы не было таких граблей, как выше..
А что вас, собственно, тут смущает? Для того, чтобы программировать на языке, надо сначала прочитать руководство, а не использовать по принципу «вроде на Си похоже, значит и работает так же»
Смущает то, что в PHP очень мало ограничений на структуру кода и очень легко писать неправильный код.
Вот собственно из-за таких вот прелестей жизнедеятельности и говорят что “php - это недоязык”, что “на нем пишут одни малолетние быдлокодеры”
IMHO - это явное проявление негатива от неявной типизации
P.S. Надо было дописать “НИКОГДА ТАК НЕ ДЕЛАЙТЕ”
Vadim, по-моему это не от “недоязыка”, а от нежелания читать мануалы и документацию. Причем тут типизация? Прямо все языки должны быть похожи друг на друга с одинаковой типизацией? Таким образом можно сказать, что если у программиста на с++ получилась утечка памяти, то виноват язык, потому, что не закрывает утечки, а не программист, что не прочитал документацию на должном уровне и не подумал о том, что нужно закрывать дырки с памятью.
Не мешайте зеленое с грязным..
От нежелания читать мануалы - это конечно же в первую очередь.
Это все равно что если бы в Java (какую вроде никто не называет “недоязыком”) сравнивать строки оператором “==”.
А вот непрозрачность приведения типов - это уже недочет языка.
Минус именно в том, что подобные типы вообще возникают.
Если мне не изменяет память, то за лет 5 активной разработки на PHP с подобными “граблями” сталкиваться не приходилось.
String s = “one”;
String p = “one”;
System.out.println(s == p);
И в чем проблема?
Проблема в том, что это частный случай.
В данном примере джава-машина создаст _один_ объект, содержащий “one”. Так как это оптимизация уровня компиляции. На который и будут указывать s и p. Соответственно, они будут равны.
(на Java не пишу, увы, хотя и давно собираюсь)
Да, кстати, следует учесть, что s и p — это не строки.
Это указатели на строковые объекты
Ох, не удержусь и пропиарю (тем паче что в тему) —
http://voituk.kiev.ua/2007/12/01/just-another-java-internals-task/
Уважаемый Алекс, я думаю, вам стоит этот тест пройти
Не вижу непрозрачности, все в этом примере нормально, строка преобразовалась к числу как 0.
Ах, и ведь знал, почему так
И все равно — не поленился, полез в доку, прочитал
Шутник, в общем