Morgan » 2010.11.25 11:18

Базовый класс

Код:

1
span style="color: #0000BB"><?php class Registry { /** * Хранилище */ static private $data = array(); /** * Сохранение значения */ static public function set($name, $value, $space = 'global') { self::$data[$space][$name] = $value; return $value; } /** * Получение значения */ static public function get($name, $space = 'global') { return isset(self::$data[$space][$name]) ? self::$data[$space][$name] : false; } /** * Очищение всех данных */ static public function clear($space = 'global') { self::$data[$space] = array(); return true; } /** * Проверка на существование * * @since 19.11.2010 * @fail Назвать метод isset() невозможно */ static public function is_set($name, $space = 'global') { return isset(self::$data[$space][$name]); } /** * Дамп данных * * @since 19.11.2010 */ static public function dump($space = 'global') { return self::$data[$space]; } }?>

Производные классы, для хранения данных в других областях видимости строятся по подобию

Код:

1
span style="color: #0000BB"><?php class MF_Registry extends Registry { static private $space = 'MF'; static public function set($var_name, $var_set){return parent::set($var_name, $var_set, self::$space);} static public function get($var_name){return parent::get($var_name, self::$space);} static public function is_set($var_name){return parent::is_set($var_name, self::$space);} static public function clear(){return parent::clear(self::$space);} static public function dump(){return parent::dump(self::$space);} }?>

Возможно ли усовершенствовать такой механизм?

Gemorroj » 2010.11.25 11:51

Код:

1
span style="color: #0000BB"><?phpRegistry::set('test', null);var_dump(Registry::get('test'));

используй в get array_key_exists
полчему нельзя назвать метод isset?
и, я бы еще настоятельно советовал приватные и защщенные методы и свойства назвать с символа подчеркивания. очень улучшает читабельность.

Morgan » 2010.11.25 12:01

Код:

1
2
3
4
class test
{
public function isset(){}
}

=> Parse error: syntax error, unexpected T_ISSET, expecting T_STRING

Gemorroj » 2010.11.25 12:23

да, я не прав. тут нужны магические сеттеры/геттеры.

Код:

1
span style="color: #0000BB"><?phpclass test{ static public $v = true; public function __get($x) { return isset($x); }}var_dump(isset(test::$v));
Morgan » 2010.11.25 15:02

Ну а как насчет наследования? Копипастить содержимое при каждом наследовании не хочется

Gemorroj » 2010.11.25 15:22

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

Morgan » 2010.11.25 16:04

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

Fuelen » 2010.11.26 13:54

магический метод __isset(). Вообще, в регистри все методы магические должны быть) удобно

Morgan » 2010.11.26 23:54

Вроде бы магические методы статическими быть не могут.

Morgan » 2010.11.29 00:41

Идей нет?

Gemorroj » 2010.11.29 12:02

я псто N 7 не понял. зачем вызывать родительские методы, если они уже у нас отнаследованы?
область  видимости передавай параметром