March 19th, 2008

манул

Программистское

В последнее время пашу как папа Карло, его лошадь и его собака, вместе взятые. PHP, HTML, CSS, JavaScript, AJAX и MySQL уже по ночам снятся...

В связи с этим вспомнились две моих "любимых" глюкофичи в PHP как в языке.

На первую я напоролся месяца три назад. Пишу примерно следующее:
$a=false;
$b=true;
$a=$a or $b;
(про && и || я знаю, но как старый паскалист, предпочитаю and и or этим сишным закорючкам)... и получаю $a==false !!! Я потратил час, чтобы локализовать это место, и ещё полчаса бился головой о клавиатуру, думая, что я сошёл с ума. Чуть ли не с детства знаю, что false or true==true, а тут на́ тебе... В конце концов, как всегда, пришлось залезть в документацию — и тут выяснилось, что приоритет операций and и or ниже приоритета операции присваивания! Т.е. выполняется следующее:
($a=$a) or $b;
т.е. фактически не выполняется ничего. Мда. Насколько я понимаю, такой приоритет для and и or позаимствован из Perl'а, чтобы можно было в перловском стиле писать:
сделать_чего-то_там or die('капец');
На мой взгляд, такая имитация естественного (английского) языка в языке программирования совершенно ни к чему (как вспомню Кобол, так вздрогну). Языки программирования должны следовать логике, а не имитировать человеческий язык.

(Кстати, приоритеты and и or ещё, оказывается, равны, т.е. в сложных выражениях скобки надо ставить).

Ну а вторую глюкофичу я знаю много-много лет, но напарываюсь на неё регулярно. Это старая ловушка всех си-образных языков. Если случайно в условии вместо == написать =, то компилятор/интерпретатор это спокойно проглотит и послушно выполнит присваивание, а потом результат сравнит с нулём. Стоит где-то просто опечататься, и часы увлекательного вылавливания глюка обеспечены :( В современных компиляторах C/C++ на такую конструкцию по крайней мере выдаётся предупреждение, а в более современных языках (Java, C#, D) так вообще невозможно написать (насколько я знаю), но PHP это проглатывает незамеченно, как компиляторы C в старые добрые времена... Вот за такие штуки я C и си-образный синтаксис и не люблю. Я, как старый паскалист, считаю, что выражение — это выражение, а присваивание — это оператор, и не фиг смешивать одно с другим.

Вот, поворчал, и вроде как полегчало :)