Типы переменных

Не то чтобы я только сегодня узнал о том, что существуют различные типы переменных. Но так уж получилось, что любое обвинение, в том, что я тут планомерно занимаюсь рерайтом php.net выглядит очень обоснованным. Впрочем подобные претензии (говорят) можно предъявить практически к любому учебнику или руководству по PHP.

У PHP  есть особенность, которая (опять же слышал) нравится новичкам и не нравится серьезным программистам от PHP — типизация языка не строгая. То есть PHP самостоятельно может присвоить переменной другой тип, если это окажется удобно по его мнению. Напрмер, Если вы захотите (ну мало ли) сложить Правду и число.

А давайте и попробуем.

<?php
$a=1;
$b=true;
echo $a;
echo "<br />";
echo $b;
echo "<br />";
echo $a+$b;

И вот здесь мы увидим результат работы кода

http://ex.stosite.ru/php/10_2016/truplusone.php

Поскольку у нас PHP не может сложить правду и число то он берет и приводит переменную $b к числу, а правде соответствует единица. И благополучно складывает две единицы.

Очень удобно, не правда ли? На самом деле не очень. Но мой уровень не позволяет пока оценить и внятно объяснить где же тут нас подстерегают проблемы. А они подстерегают, уж будьте уверены.

Тот же результат мы получим, если назначим $a=»1″, то есть не числом, а строкой. PHP все равно приведет ее к числу и сложит.

Впрочем можно сделать и по.. хуже.

Допустим нам довелось сложить правду и 33 коровы. Для PHP ответ очевиден

<?php
$a="33 коровы";
$b=true;
echo $a;
echo "<br />";
echo $b;
echo "<br />";
echo $a+$b;

Результат здесь http://ex.stosite.ru/php/10_2016/33korovi.php

Кстати о комментариях, в учебных целях, ну или при каком-то зашкаливающем фанатизме, для того чтоб было понятно всем можно код записать так:

<?php // это открывающий тег PHP
$a="33 коровы"; // присваиваем переменной $a значение "33 коровы", это значение строка
$b=true; // присваиваем $b значение true - это булев-тип переменной
echo $a; //выводим на экран переменную $a
echo "<br />"; // выводим на экран html-тег <br /> для переноса строки
echo $b; //выводим на экран переменную $b
echo "<br />"; // выводим на экран перенос строки
echo $a+$b; // выводим на экран сумму переменной $a и переменной $b

Спрашивается, нужно ли так комментировать работу кода? Очевидно нет. Любой PHP-программист, который будет это читать поймет все и без всяких комментариев, поскольку тут мы делаем очевидные вещи. С другой стороны, для человека, который впервые, ну или почти впервые сталкивается с PHP подобное изобилие комментариев может оказаться очень удобным.

К сожалению, я не могу протоколировать каждую свою синтаксическую ошибку просто знайте они есть. Если вы в тексте пропускаете запятую или неправильно пишите какое-то слово (ну бывает же), то и ничего страшного обычно — в коде же все рушится и пропущенная запятая, а чаще точка с запятой являются очень распространенными синтаксическими ошибками. Благо они легко находятся и устранаются.

И да, в итоге код для вывода я переписал вот таким образом, что уж выводились не только переменные но и информация, что это они и есть.

<?php
$a="33коровы";
$b=true;
echo '$a=', $a;//добавил '$a=', чтобы это отобразилось на мониторе и выглядело понятнее
echo "<br />";
echo '$b=', $b;
echo "<br />";
echo '$a+$b=', $a+$b;

Ах да типы

Четыре скалярных типа:

boolean (правда-неправда), integer (целые числа), float (числа с плавающей точкой), string (строка)

Три смешанных типа:

array (массив), object (хм.. объект? не понимаю пока что это и о чем), callable (обратные функции, очевидно разум еще не настолько просветлен, чтоб осознать это.)

Два специальных типа:

resource (ресурс ага) и NULL (это что-то типа нуля, но не ноль — это ничего).

Присвоить новый тип для переменной можно с помощью фунции settype, а функция gettype возвращает тип переменной.

Так в нашем примере можно исправить переменную $b из булев типа в строку и вывести значение до и после изменения.

<?php
$a="33коровы";
$b=true;
echo '$a=', $a;//добавил '$a=', чтобы это отобразилось на мониторе и выглядело понятнее
echo "<br />";
echo '$b=', $b;
echo "<br />";
echo gettype($b);
echo "<br />";
echo '$a+$b=', $a+$b;
echo "<br />";
echo gettype($b);

Результат здесь http://ex.stosite.ru/php/10_2016/gettype.php

Можно обратить внимание, что тип переменной $b не поменялся в результате сложения, хотя в ходе самого сложения переменная и использовалась как числовая, а не как булев.

Можно бы добавить сюда функцию settype ($b, integer); которая сделает $b числовой переменной. Можно бы, но я не буду (на самом деле я попробовал — работает).

Еще функции по работе с типами

Для того чтобы получить данные о переменной — значение и тип достаточно применить функцию var_dump.  И еще не надо путать gettype — который просто показывает значение типа переменной и is_type фунции напрммер Is_int, которая позволяет проверить, является ли тип переменной числовым или нет.

Не все там так очевидно с переводом типов

Особенно булев-тип отличился. Так например $a=0, будет преобразовано в false $a=»0″ в false, а $a=»0.0″ в true.. и $a=»false» тоже будет преобразовано true (ну правильно не пустая ж строка). Только две строковые переменные преобразовываются в false $a=»0″ и $a=»», а это прямо скажем совсем не очевидно.

тип integer тоже не всегда очевиден. Например он имеет определенный лимит и если число больше 2миллиардов (примерно) то в integer уже не помещается и преобразуется автоматически в float — число с плавающей точкой. Также integer может быть в разных системах исчисления, а не только в десятичной.

Float — числа с плавающей точкой тоже какие-то странные. Они часто бывают примерными. И Два в принципе одинаковых числа с плавающей точкой могут оказаться на поверку не равны между собой. В общем с ними надо точно аккуратнее.

Строки. Дальше интереснее, точнее сложнее в разделе, посвященном строкам я встретил столько незнакомых терминов, что очевидно, понять сейчас все мне просто не удастся. Ну ок, вернусь еще к этому обязательно. Тем более по мануалу явно придется лазить еще не раз.

Забавная штука хередок heredoc — конструкция, позволяющая писать код не в строчку, а как он записан в тексте — что-то вроде тега <pre> для html.

И управляющие конструкции интересные: видел я их и раньше, но вроде их использование становится понятнее.

Помните код про сложение коров и истины (конечно помните, это ж на этой же странице, хоть у меня и вчера это было)

http://ex.stosite.ru/php/10_2016/gettype.php

Так вот, для того, чтоб информация выводилась в одну строку я использовал echo «<br />»; — выводил тег html, который осуществляет перенос строки, но с тем же успехом можно к каждому коду просто добавить \n

Вот так это будет выглядеть:

<?php
$a="33коровы";
$b=true;
echo '$a=', "$a\n";

echo '$b=', "$b\n";

echo gettype($b)."\n";

echo '$a+$b=', $a+$b."\n";

echo gettype($b);

Результат мы получим точно такой же, а команд используем почти вдвое меньше. Нет.. не получим. Похоже это изменение влияет лишь на отображение исходного кода

view-source:http://ex.stosite.ru/php/10_2016/gettype.php

One comment

  1. Я сейчас изучаю java, вот там типизация строгая. Объявил не тот тип и программа не будет компилироваться.

Leave a Reply

Ваш e-mail не будет опубликован.