Всем привет!
Сегодня мы напишем замену паттерну Singleton, ибо его я бы предпочел использовать только начиная с версии PHP 5.3 (об этом в прошлой лекции).
Registry (core/classes/registry.php):
<?php if (!defined('APP')) die('Access is forbidden!!!');
class Registry_Core {
/**
* @var array Объекты
*/
public static $objects = array();
/**
* Возвращает объект по имени и идентификатору
*
* @param string $class
* @param string $id
* @return Object
*/
public static function get($class, $id = 'default') {
$class = strtolower($class);
if (!isset(self::$objects[$class])) {
self::$objects[$class] = array();
}
if (!isset(self::$objects[$class][$id])) {
if (class_exists($class, true)) {
self::$objects[$class][$id] = new $class();
} else {
self::$objects[$class][$id] = false;
}
}
return self::$objects[$class][$id];
}
}
if (!defined('REGISTRY_CLASS')) {
class Registry extends Registry_Core { }
}
Надеюсь объяснять что тут и как работает не придется, ибо все довольно просто...
Ну а теперь добавим две функции в класс Object для упрощения работы с классом Registry.
Object (core/classes/object.php):
<?php if (!defined('APP')) die('Access is forbidden!!!');
abstract class Object_Core extends Observed {
/**
* Возвращает объект контроллера по имени
*
* @param string $controller
* @param string $id
* @return Object
*/
private function getController($controller, $id = 'default') {
return Registry::get($controller . '_Controller', $id);
}
/**
* Возвращает объект модели по имени
*
* @param string $controller
* @param string $id
* @return Object
*/
private function getModel($model, $id = 'default') {
return Registry::get($model . '_Model', $id);
}
}
if (!defined('OBJECT_CLASS')) {
abstract class Object extends Object_Core { }
}
Возможно это и бред, но когда под рукой удобный редактор с autocomplet'ом, при обращении к разным контроллерам и моделям постоянно писать _Controller и _Model не придется и время, затрачиваемое на разработку, малость уменьшится...
На этом пока все... Заданий пока не будет...