PHP порадовал

Нашёл ста­рень­кий при­мер, кото­рый, ока­зы­ва­ет­ся, до сих пор рабо­та­ет.

var_dump(md5(‘240610708’) == md5(‘QNKCDZO’));

Выда­ёт bool(true).

То-есть, MD5 хеши для строк ‘240610708’ и ‘QNKCDZO’ явля­ют­ся оди­на­ко­вы­ми (с точ­ки зре­ния PHP).

С нор­маль­ной точ­ки зре­ния хеши неоди­на­ко­вы. Пер­вый 0e462097431906509019562988736854, вто­рой — 0e830400451993494058024219903391.

Но. Опе­ра­тор срав­не­ния == в PHP может на ходу пре­об­ра­зо­вать тип дан­ных (type mangling). Эти стро­ки оно пере­де­лы­ва­ет в циф­ры в экс­по­нен­ци­аль­ной запи­си. Всё, что до ‘e’ — ман­тис­са, всё, что потом — поря­док. А так как ман­тис­са у нас 0, её мож­но умно­жать хоть на чёр­та лысо­го, она всё рав­но оста­нет­ся нулём. 0 == 0, есте­ствен­но, воз­вра­ща­ет­ся true.

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

В PHP дан­ная ошиб­ка про­грам­ми­ста (про­грам­ми­ста ли?) лечит­ся исполь­зо­ва­ни­ем спе­ци­аль­но­го опе­ра­то­ра срав­не­ния === вме­сто ==, т.е. стро­гим срав­ни­ва­ни­ем вме­сто обыч­но­го, без пре­об­ра­зо­ва­ния типов.

Вот имен­но поэто­му не сле­ду­ет учить­ся про­грам­ми­ро­ва­нию на язы­ках со сла­бой и дина­ми­че­ской типи­за­ци­ей дан­ных. На пито­нах, пер­лах и php мож­но, напри­мер, срав­нить «1» и 5. А Джа­ва неза­мед­ли­тель­но пошлёт погро­ми­ста нахер: не срав­ни­вай божий дар с яич­ни­цей. Плюс на Джа­ве то, что выгля­дит так как на Си, рабо­та­ет так же. Что, на мой взгляд, архи­вер­но.