Дмитрий Сергеевич (axshavan) wrote,
Дмитрий Сергеевич
axshavan

Неявное преобразование типов переменных

Это вообще очень опасная и неприятная штука. Опасная тем, что расхолаживает программиста, и тот перестаёт следить за типами переменных в коде. Опасная тем, что может приводить к совершенно неожиданным для программиста результатам.
Ну вообще неявного преобразования типов переменных нет в таких суровых языках, как си или паскаль. А вот в менее суровом и более простеньком, таком, как пхп, есть. Как вы думаете, что будет, если к строке попытаться прибавить число? Сишный или паскальный компилятор должен ругаться и говорить, что не совпадают типы переменных. Пусть даже у вас строка вида "123", всё равно надо её предварительно переделать в число 123. В си это какая-нибудь функция типа atoi(), в дельфи что нибудь вроде strtoint().

Но что сделает пхп в том случае, если вы попытаетесь прибавить к строке число? Интерпретатор, не спрашивая разрешения, сам переведёт строку в число и прибавит, и даже никакой нотис не покажет. Поэтому типы переменных integer, string, bool и float в пхп свободно перетекают друг в друга. Кстати говоря, пхп без спросу может преобразовывать и такие типы переменных, как объект, массив и ресурс, теряя из них всё, что можно, поэтому надо аккуратнее за этим всем следить.

То же и при сравнении. Строка "123" и число 123 оказываются в пхп вполне однаковыми при сравнении оператором ==. Поэтому существует специальный оператор ===, подавляющий неявное преобразование типов переменных:
echo "123" == 123; // 1
echo "123" === 123; // 0
И ещё один классический пример. Функция strpos() ищет подстроку в строке и возвращает либо её позицию (количество символов от начала строки до начала найденной в ней подстроки), либо false. Если строка начинается с искомой подстроки, то, разумеется, strpos() вернёт 0. 0 и false это разные вещи, но различить их можно только с помощью ===, при использовании == может оказаться так, что выполнение алгоритма пойдёт в неправильном направлении.

В джаваскриптах ситуация ещё хуже. Если в пхп конкатенация строк (слепление нескольких строк в одну, у нас, у программистов, это называется именно так) производится оператором-точкой, то в джаваскриптах для этого годится обычный плюс. Поэтому получаются разнообразные эффекты.
alert((1 + 1) / 2); // 1
alert((1 + "1") / 2); // 5.5
alert((1 + 1 + "1") / 2); // 10.5

Не знаю, как дела обстоят в перле и питоне. У меня есть мысль, что надо их как-нибудь выучить для собственного, так сказать, саморазвития.
Tags: web
Subscribe

  • Как у меня дела (четверг)

    Постепенно жизнь возвращается в прежнее, ещё до-хоум-офисное, русло. А надо-то было всего ничего, неделю походить на работу в офис. Но, разумеется,…

  • Два дня в офисе

    Ах да, забыл написать пост :) Совсем заработался. Так вот, результат PCR-теста пришёл отрицательный примерно через 25 часов после того, как я его…

  • И снова про работу

    Два дня — четверг и пятницу — сходил в офис поработать. Всё, мой многомесячный хоум-офис закончился, теперь снова работаю по-старинке, с личным…

  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 12 comments

  • Как у меня дела (четверг)

    Постепенно жизнь возвращается в прежнее, ещё до-хоум-офисное, русло. А надо-то было всего ничего, неделю походить на работу в офис. Но, разумеется,…

  • Два дня в офисе

    Ах да, забыл написать пост :) Совсем заработался. Так вот, результат PCR-теста пришёл отрицательный примерно через 25 часов после того, как я его…

  • И снова про работу

    Два дня — четверг и пятницу — сходил в офис поработать. Всё, мой многомесячный хоум-офис закончился, теперь снова работаю по-старинке, с личным…