Содержание
Prefab & Registry
Prefab - это обёртка-сборщик (factory) для синглтонов. Он использует класс Registry для хранения объектов.
Пространство имен: \
Расположение файла:lib/base.php
Prefab
Если вы хотите, чтобы один из ваших классов был синглтоном(гарантирующим, что в однопоточном приложении будет единственный экземпляр некоторого класса), просто расширьте класс Prefab:
class MyClass extends \Prefab { private $year; function getYear() { return $this->year; } function __construct() { $this->year=date('Y'); } }
Таким образом, класс будет создан не более одного раза. Чтобы получить синглтон, используйте статический метод instance():
// somewhere in the code $obj=MyClass::instance(); // First call: a new object is created echo $obj->getYear(); // somewhere else in the code $obj=MyClass::instance(); // Second call: the object already exists and is simply returned echo $obj->getYear();
Большинство классов F3 (Base, Cache, View, Template, Web и т. Д.) являются производными от Prefab
Registry
Каждый отдельный объект хранится в реестре. Реестр принимает несколько команд:
get
Получить объект из реестра
$obj=\Registry::get('MyClass');
set
Сохранить объект в реестре
$obj=new MyClass(); \Registry::set('MyClass',$obj);
clear
Удалить объект из реестра
\Registry::clear('MyClass');
exists
Проверить, хранится ли объект в реестре
if (\Registry::exists('MyClass')) echo 'Singleton instanciated'; else echo 'Singleton not instanciated';
Передача аргументов
Если вам нужно передать аргументы во время создания экземпляра класса, вы можете сделать это двумя способами:
Использование Prefab
// somewhere in the code $obj = MyClass::instance($a,$b); // First call: a new object is created // somewhere else in the code $obj = MyClass::instance(); // Second call: the existing object is returned
Помните, что аргументы, переданные в функцию instance() после первого вызова, будут проигнорированы.
Использование реестра
$obj1 = new MyClass($arg1); \Registry::set('MyClass1',$obj1); $obj2 = new MyClass($arg2); \Registry::set('MyClass2',$obj2);