Пример организации класса 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 и выше.
Разжевал бы про синглтон, про невозможность создать 2 и более объекта класса.
Больно сухо как-то.
От globals спасает, если взять за практику передавать в конструктор
Потом напишу отдельную статью про синглтон… ну или кто-нибудь напишет
У меня вместе с 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
получить значение
$value = registry("name");и затать значение
$obj = registry("obj", new myObj());@Aco
Что за процедурщина?
назови минусы такого метода
@Aco
Ну как минимум лишний код. Тебе не что не мешает сделать так:
Да и не очень красиво(не по ооп
)… а так вполне работоспособный вариант
Всё это ваши предрассудки
где тут лишний код? Меньше чем у тебя вышло.
@Aco
Лишний в виде функции. Ты из функции вызываешь класс.
А если на одной странице несколько вызовов(этак 20-30) ты каждый в функции будешь пересоздавать объект? Жирно будет.
Стоп! Ни где не пересоздаётся, функция забирает и возвращает созданный Instance.
эта функция – помощник, а не замена ::init()
@Aco
Я понимаю что не создается, но все равно, получать прототип 20 раз это не true.
Странно получается вообще, делать процедурную оболочку для класса.
При
$registry = registry::getInstance();
$registry будет всего лишь указатель.
Из опыта скажу, что в процедурных оболочках есть свои плюсы.
Но его же все равно нужно получить. Можно сразу в registry заложить все удобства.
Нужно будет протестировать с профайлингом оба подхода
здесь дело не в скорости, а в удобстве. да и что тут может тормозить?
Сижу и жумаю, как бы так написать функцию для Aco функции для TUX класса, только покороче и чтоб быстро удобно =))
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); }вот и совместили. Даже имя можно одно и то-же оставить.