edit
Prefab & Registry
Prefab is a factory wrapper for singleton classes. It uses the Registry class to store objects.
Namespace: \
File location: lib/base.php
Prefab
If you want one of your classes to be singleton, just make it extend the Prefab class:
class MyClass extends \Prefab {
private $year;
function getYear() {
return $this->year;
}
function __construct() {
$this->year=date('Y');
}
}
This way, the class will be instantiated no more than once. To retrieve the single object, use the static instance()
method:
// 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();
NB: Most F3 classes (Base, Cache, View, Template, Web, etc.) are derived from Prefab
Registry
Under the hood, each single object is stored in the Registry. The Registry accepts a few commands:
Get
Retrieve an object from the registry
$obj=\Registry::get('MyClass');
Set
Store an object into the registry
$obj=new MyClass();
\Registry::set('MyClass',$obj);
Clear
Remove an object from the registry
\Registry::clear('MyClass');
Exists
Check if an object is stored in the registry
if (\Registry::exists('MyClass'))
echo 'Singleton instanciated';
else
echo 'Singleton not instanciated';
Passing arguments
If you need to pass arguments during class instantiation, you can do it in two ways:
Using 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
Beware that the arguments passed to the instance() function after the first call will be ignored.
Using Registry
$obj1 = new MyClass($arg1);
\Registry::set('MyClass1',$obj1);
$obj2 = new MyClass($arg2);
\Registry::set('MyClass2',$obj2);