Главная > PHP > Пример организации класса registry

Пример организации класса registry

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

< ?php
	/**
	 * Класс регистрации переменных системы
	 * @author TUX

	 */
	class registry
	{
		/**
		 * Массив переменных
		 * @var array
		 */
		private $vars = array();
		/**
		 * Синглтон объект
		 * @var object
		 */
		private static $_instance;

		/**
		 * Функция создания объекта (синглтон)
		 * @return object
		 */
		public static function init()
		{
			if (!self::$_instance)
			{
				self::$_instance = new self;
			}
			return self::$_instance;
		}

		/**
		 * Магический медот записи новой переменной
		 * @param string $key
		 * @param mixed $var
		 * @return true
		 */
		public function __set($key, $var)
		{
			if(isset($this->vars[$key]) == true)
			{
				throw new Exception('Unable to set var `' . $key . '`. Already set.');
			}
			$this->vars[$key] = $var;
			return true;
		}

		/**
		 * Магический метод получения переменной
		 * @param string $key
		 * @return mixed
		 */
		public function __get($key)
		{
			if(isset($this->vars[$key]) == false)
			{
				return null;
			}
			return $this->vars[$key];
		}

		/**
		 * Метод удаления переменной
		 * @param string $key
		 * @return true
		 */
		public function remove($key)
		{
			unset($this->vars[$key]);
			return true;
		}
	}
?>

Использование:

< ?php
	// Получаем объект registry
	$registry = registry::init();

	// Записываем в переменную test строчку
	$registry->test = 'Lorem ipsum dolor sit amet';

	print 'Проверим'; // Проверим
	var_dump($registry->test);

	// Для убедительности удалим объект
	unset($registry);

	// Создадим второй объект
	$registryNew = registry::init();

	print 'А вот и наша переменная'; // А вот и наша переменная
	var_dump($registryNew->test);
?>

В итоге получим:

Проверим
string 'Lorem ipsum dolor sit amet' (length=26)
А вот и наша переменная
string 'Lorem ipsum dolor sit amet' (length=26)

Вот такая удобная штука.

зы: это работает только в php версии 5 и выше.

Categories: PHP Tags: ,
  1. jarool
    27 Март 2009 в 17:37 | #1

    Разжевал бы про синглтон, про невозможность создать 2 и более объекта класса.
    Больно сухо как-то.

    От globals спасает, если взять за практику передавать в конструктор

  2. 27 Март 2009 в 17:39 | #2

    Потом напишу отдельную статью про синглтон… ну или кто-нибудь напишет ;-)

  3. 27 Март 2009 в 19:34 | #3

    У меня вместе с registry классом поставляется registry функция, которая позволяет на лету получить или задать переменную:

    function registry($key = null, $val = null)
    {
       $registry = registry::getInstance();
       if($key === null)
          return $registry;
       if($val !== null)
          $registry[$key] = $val;
    
       return isset($registry[$key]) ? $registry[$key] : null;
    }

    собственно, с этим можно получить сам registry

    $registry = registry();

    получить значение

    $value = registry("name");

    и затать значение

    $obj = registry("obj", new myObj());
  4. 27 Март 2009 в 21:03 | #4

    @Aco
    Что за процедурщина? :-D

  5. 27 Март 2009 в 23:46 | #5

    назови минусы такого метода

  6. 28 Март 2009 в 00:00 | #6

    @Aco
    Ну как минимум лишний код. Тебе не что не мешает сделать так:

    registry::set($key, $val);
    $val = registry::get($key);
    

    Да и не очень красиво(не по ооп :-D )… а так вполне работоспособный вариант ;-)

  7. 28 Март 2009 в 01:35 | #7

    Всё это ваши предрассудки :)

    $val = registry($key);

    где тут лишний код? Меньше чем у тебя вышло.

  8. 28 Март 2009 в 01:41 | #8

    @Aco
    Лишний в виде функции. Ты из функции вызываешь класс.
    А если на одной странице несколько вызовов(этак 20-30) ты каждый в функции будешь пересоздавать объект? Жирно будет.

  9. 28 Март 2009 в 01:46 | #9

    Стоп! Ни где не пересоздаётся, функция забирает и возвращает созданный Instance.

  10. 28 Март 2009 в 01:50 | #10

    эта функция – помощник, а не замена ::init()

  11. 28 Март 2009 в 01:53 | #11

    @Aco
    Я понимаю что не создается, но все равно, получать прототип 20 раз это не true.
    Странно получается вообще, делать процедурную оболочку для класса.

  12. 28 Март 2009 в 01:55 | #12

    При
    $registry = registry::getInstance();
    $registry будет всего лишь указатель.
    Из опыта скажу, что в процедурных оболочках есть свои плюсы.

  13. 28 Март 2009 в 01:58 | #13

    Aco :
    $registry будет всего лишь указатель.

    Но его же все равно нужно получить. Можно сразу в registry заложить все удобства.
    Нужно будет протестировать с профайлингом оба подхода ;-)

  14. 28 Март 2009 в 09:53 | #14

    здесь дело не в скорости, а в удобстве. да и что тут может тормозить?

  15. jarool
    28 Март 2009 в 11:16 | #15

    Сижу и жумаю, как бы так написать функцию для Aco функции для TUX класса, только покороче и чтоб быстро удобно =))

  16. 29 Март 2009 в 15:24 | #16

    jarrol, а чего там думать?

    function registry($key = null, $val = null)
    {
    
    	$registry = registry::init();
    	if($key === null)
    		return $registry;
    	if($val !== null)
    		$registry->set($key, $val);
    
    	return $registry->get($key);
    }

    вот и совместили. Даже имя можно одно и то-же оставить.

  1. Пока что нет уведомлений.