Приднестровская поддержка XOOPS
Еще одним новшеством в объектной модели в 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() существует. Далее вы увидите, что указание типов может быть очень полезным, если использовать его вместе с интерфейсами (см. раздел “Интерфейсы” далее в этой инструкции).
Отправитель | Нити |
---|
4 пользователь(ей) активно (2 пользователь(ей) просматривают Инструкции)
Участников: 0 Гостей: 4 далее... |