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);
Печать/экспорт