Оглавление

Указание типов

Еще одним новшеством в объектной модели в PHP 5 является указание типов (typehinting). В самом языке PHP использование типов не предусмотрено. Это означает, что переменные могут хранить данные произвольного типа. Действительно, одна и та же переменная в одном случае может обрабатываться как целочисленная переменная, а в другом — как строковая переменная. Тем не менее, поскольку методы внутри объектов часто принимают параметры, которые являются экземплярами других объектов, PHP 5 позволяет ограничивать типы данных для параметров методов. Рассмотрим пример, представленный в листинге 5.

 

Листинг 5


class Integer {
    private $number;
    public function getInt() {
        return (int)$this->number;
    }
        public function setInt($num) {
        $this->number = (int)$num;
    }
}
class Float {
    private $number;
    public function getFloat() {
        return (float)$this->number;
    }
    public function setFloat($num) {
        $this->number = (float)$num;
    }
}

 

В этом листинге определяются два класса, Integer и Float, которые реализуют простые оболочки для этих типов данных в PHP. А если бы нужно было реализовать класс для сложения всего двух чисел в формате с плавающей точкой? Мы с вами уже кое-чему научились, поэтому подходящее решение может выглядеть примерно так:

 


class Math {
    public function add($op1, $op2) {
        return $op1->getFloat() + $op2->getFloat();
    }
}

 

Однако в силу особенностей PHP невозможно гарантировать, что параметры $op1 и $op2 будут являться экземплярами класса Float. Даже если бы мы точно знали, что они являются объектами, все равно у нас нет способа узнать, имеют ли они подходящий тип. Одним из возможных решений является использование новой операции PHP 5 instanceof, которая возвращает экземпляр определенного класса, как показано в листинг 6.

 

Листинг 6


class Math {
    public function add( $op1, $op2 ) {
        if( ( $op1 instanceof Float ) && ( $op2 instanceof Float ) ) {
            return $op1->getFloat() + $op2->getFloat();
        } else {
            echo "Должны быть переданы два экземпляра Float!\n";
        }
    }
}

 

Теперь у класса Math есть способ, позволяющий установить, что передаваемые параметры являются объектами соответствующего типа. Однако такой способ может быстро привести к тому, что в вашем коде возникнут ошибки и его будет невозможно прочитать. Гораздо более удобный подход к решению этой же задачи заключается в том, чтобы в прототипе функции определить требуемый тип, как показано в листинге 7.

 

Листинг 7


class Math {
    public function add( Float $op1, Float $op2 ) {
        return $op1->getFloat() + $op2->getFloat();
    }
}

 

Теперь можно четко определить требуемый тип с помощью метода add(), и быть уверенным, что метод getFloat() существует. Далее вы увидите, что указание типов может быть очень полезным, если использовать его вместе с интерфейсами (см. раздел “Интерфейсы” далее в этой инструкции).

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити