Профессиональное программирование на PHP

Страница 70 из 591


Переопределение 73

тип переменной (например, заставить определенную скалярную переменную быть целочисленной). Это можно сделать в коде приложения: вручную проверять данные до присвоения переменной значения, однако подобный подход может быть громоздким и требовать значительного дублирования кода; кроме того, можно просто забыть это сделать.

Используя методы_get () и_set (), можно реализовать контроль типов при

назначении определенных свойств объекта. Эти свойства не будут объявляться как стандартные атрибуты. Вместо этого они будут храниться в частном массиве внутри объекта. Кроме того, определяется таблица типов, состоящая из переменных, типы которых необходимо проверить, а также функция, применяемая для проверки типов переменных. Ниже показан класс, который назначает тип string свойству name и тип int еде г свойству count е г.

class Typed {

private $props = array () ; static $types = array (

"counter" => "is_integer", "name" => "is_string"

) ;

public function _get($name) {

if(array_key_exists($name, $this->props)) { return $this->props[$name];

}

}

public function _set($name,$value) {

if (array_key_exists ($name, self:-. $types)) {

if(call_user_func(self::$types[$name],$value)) { $this->props[$name] = $value;

}

else {

print "Ошибка назначения типа \n"; debug_print_backtrace () ;

}

}

}

}

Когда происходит присвоение значений, свойство, которому задается значение, ищется в массиве self: : $types, и запускается функция его проверки. Если типы совпадают, то присвоение выполняется. Это можно проверить, выполнив следующий код:

$obj = new Typed; $obj->name = "Georgefl; $obj->counter = 1;

Однако, если попытаться нарушить ограничения типов (присвоив массив свойству $obj->name, тип которого— строковый), то возникнет неисправимая ошибка. Выполнение кода

$obj = new Typed;

$obj->name = array ("George") ,-

приведет к возникновению следующей ошибки:




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006