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

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

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

Сообщение gaidar » 06.09.2004 (Пн) 11:18

Автоматическое приведение типов в PHP в очередной раз подтвердило subj. Тут помогал разобраться в одном проекте, у человека ситуация такова - некоторая переменная передается через GET запрос, но она может быть передана, а может быть и пропущена. Чтобы не мучаться, он решил забить такой код:

if(!isset($_GET['my_var'])) $_GET['my_var'] = 0;

Далее у него происходят проверки следующего типа:

if($_GET['my_var'] = "some_value" and ...

Странно, первая часть выражения всегда True, если значение my_var не было передано в GET запросе.
Мне не составило труда разобраться - на лицо ошибка автоматического приведения типов в PHP, потому как, заменив строковую константу "some_value" на число, допустим 1, проблемы не возникает. И, чтобы исправить положение достаточно было изменить самую первую строку:

if(!isset($_GET['my_var'])) $_GET['my_var'] = 1;

И после этого меня с удивлением спрашивают, почему я так люблю жестко заданные типы или строго слежу за типом переменных там, где строгих типов нет (PHP, JavaScript, VBScript и т.п.).


Версия PHP: 4.3.4 for Windows

P.S. Иногда, знаете ли, хочется повозмущаться :)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.09.2004 (Пн) 13:18

Немного не в тему - я вообще хотел бы, чтобы ОБЯЗАТЕЛЬНО типизировались переменные и даже константы. Чтобы вместо:

dim x
x=5

нужно (не можно, а именно нужно) было писать:

dim x as integer
x=5%

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 06.09.2004 (Пн) 18:50

Посему, код должен содержать:

Код: Выделить всё
Option Explicit
Option Strict 'в .NET
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.09.2004 (Пн) 19:18

Если это то, что я думаю, я начинаю еще больше уважать .NET. Пора на него переходить.

pitbull
Постоялец
Постоялец
 
Сообщения: 314
Зарегистрирован: 25.06.2004 (Пт) 15:37
Откуда: Кемерово

Сообщение pitbull » 06.09.2004 (Пн) 19:52

gaidar, знаешь, что в PHP есть такой веселый оператор "===" и знаешь, что он делеает - сравнивает, только логически.
При его использовании ты некогда не получишь true в выражении ""=0
Так, что не знаю, ято тебя смущает в PHP. Ведь по сути он на много гибче VB. (в конкретных задачах)

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 06.09.2004 (Пн) 20:57

Меня ничего не смущает, я просто немного повозмущался :). И на счет "только логического" я знаю.
А возмущаюсь я только тем, что в доках написано очень красноречиво о автоматическом приведении типов, при этом явного приведения, которое, все-таки, напрашивается, нет в таком простейшем случае.

Кстати, проверьте в JavaScript/VBScript ;)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList  
cron