- Операции над типами
Печать: Шрифт: Абв Абв Абв
admin 26 Февраля 2006 в 20:04:59
Переключение типов

Иногда бывает удобно использовать переменные способами, не предусмотренными при их создании. Допустим, вам захочется прибавить строковое значение "15" к целому числу 12. К счастью, тип переменных РНР может изменяться и без использования механизма явного преобразования. Этот процесс, независимо от того, выполняется ли он прямо или косвенно, называется переключением (juggling) типов. Лучше всего продемонстрировать сказанное на конкретных примерах.

Предположим, вы суммируете две величины — строку и целое число. Как вы думаете, что при этом произойдет? Результат зависит от содержимого строки. Например, при суммировании целого числа со строковым представлением числа будет получено целое число:

<?
$variablel
= 1;
$variable2 = "1";
$variable3 = $variablel + $variable2;
// $variable3 присваивается 4.?>

Другой пример переключения типов — суммирование целого числа с вещественным. При этом целое число преобразуется к вещественному типу, чтобы избежать потери точности:
<?
$variablel
= 3;
$variable2 = 5.4;
$variable3 = $variablel + $variable2;
// $variablel интерпретируется как вещественное число.
// и $variable3 присваивается 8.4.
?>

Следует упомянуть о некоторых малоизвестных особенностях переключения типов. Что произойдет при попытке суммирования целого числа и строки, содержащей целое число, но не являющейся строковым представлением? Рассмотрим следующий пример:

<?
$variablel
= 5;
$variable2 = "100 bottles of beer on the wall";
$variable3 = ;variable1 + $variable2;
// $variable3 присваивается 105
?>


В результате переменной ;variable3 присваивается значение 105. Это происходит из-за того, что лексический анализатор РНР определяет тип по началу строки. Допустим, мы привели переменную $variable2 к виду "There are 100 bottles of beer on the wall". Поскольку алфавитные символы трудно интерпретировать как целое число, строка интерпретируется как 0, и переменной $variable3 присваивается 5.

Хотя в большинстве случаев переключение типов обеспечивает желаемый результат, существует способ явного приведения переменных к конкретному типу. Эта тема рассматривается в следующем разделе.

Преобразование типов

Явное приведение переменной к типу, отличному от того, который изначально предназначался для нее, называется преобразованием (casting) типа. Изменение типа может быть как временным, одноразовым, так и постоянным.

Чтобы временно привести переменную к другому типу, достаточно воспользоваться оператором преобразования типа — указать нужный тип перед именем переменной в круглых скобках (табл. 2.2).

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

  • (int) или (integer) Целое число

  • (real), (double) или (float) Вещественное число

  • (string) Строка

  • (array) Массив

  • (object) Объект


  • Простой пример преобразования типов:
    <?
    $variable1
    = 13; // $variable1 присваивается целое число 13

    $variable2 = (double) $variable1; // $variable2 присваивается 13.0
    ?>

    Хотя переменная $variable1 первоначально содержала целое число 13, преобразование (double) преобразует ее к вещественному типу (поэтому число 13 превращается в 13.0). Полученное значение присваивается переменной $variable2.

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

    <?
    $variablel
    = 4.0;
    $variable2 = 5;
    $variable3 = (int) $variable1 + $variable2; // $variable3 = 9
    ?>


    Следует заметить, что преобразование вещественного типа к целому всегда сопровождается округлением:

    <?
    $variablel
    = 14.7;
    $variable2 = (int) $varlable1; // $variable2 = 14;
    ?>


    Строку или переменную другого типа также можно преобразовать в элемент массива. В этом случае преобразованная переменная становится первым элементом массива:

    <?
    $variable1
    = 1114;
    $array1 = (array) $varable1;
    print
    $array1[0]; // Выводится значение 1114
    ?>


    Наконец, любой тип данных можно преобразовать в объект. Переменная становится атрибутом объекта, и ей присваивается имя scalar:

    $model = "Toyota";
    $new_obj = (object) $model;

    Ссылка на исходное строковое значение выглядит так:

    print $new_obj->scalar;


    Присваивание

    Вы уже знаете, как присвоить значение переменной в сценарии РНР. Тем не менее, некоторые тонкости, связанные с присваиванием, стоит выделить особо. Вероятно, вам хорошо знаком механизм присваивания по значению, при котором именованной переменной присваивается конкретное значение — например, целое число 1 или строка "ciao". Однако существует и второй механизм — присваивание по ссылке, также открывающее перед программистами немало полезных возможностей. В следующих разделах оба механизма рассматриваются более подробно.

    Присваивание по значению

    Это самый распространенный способ присваивания, при котором значение просто заносится в область памяти, представленную именем переменной. Примеры присваивания по значению:

    $vehicle = "car";

    $amount =10.23;


    В результате выполнения этих двух команд по адресу памяти, представленному именем $vehicle, сохраняется строка "car", а по адресу, представленному именем $amount, — значение 10.23.

    Присваивание по значению также может выполняться в результате выполнения команды return в функциях:
    <?
    function simple () {

    return
    5;

    }

    $return_value = simple();?>

    Функция simple( ) всего лишь возвращает значение 5, которое присваивается некоторой переменной. В данном примере значение 5 будет присвоено переменной $return_value.

    Присваивание по ссылке

    Другой способ заключается в присваивании переменной ссылки на область памяти, занимаемую другой переменной. Вместо конкретного значения переменная-приемник связывается с указателем (или ссылкой) на область памяти, поэтому фактическое копирование не выполняется.

    Чтобы присвоить значение по ссылке, укажите перед именем переменной-источника символ & (амперсанд):
    <?
    $dessert
    = "cake";
    $dessert2 = $Sdessert;
    $dessert2 = "кукиs";
    print
    "$dessert2 <br>"; // Выводится строка кукиs
    print Sdessert; // Снова выводится строка кукиs
    ?>

    Как видно из приведенного фрагмента, после связывания переменной $dessert2 со ссылкой на область памяти, занимаемую переменной $dessert, любые изменения $dessert2 приводят к автоматической модификации $dessert (и всех остальных переменных, ссылающихся на эту же область памяти).
    Добавить сообщение
    Чтобы добавлять комментарии зарeгиcтрирyйтeсь