Revision: 25393
Updated Code
at June 7, 2013 07:05 by freelancephp
Updated Code
<?php
/**
* Lim_Registry Class
*
* Registry for managing global vars and references with support for lazy loading.
*
* @package Registry
* @version 2.0.0
* @author Victor Villaverde Laan
* @link http://www.freelancephp.net/lim_registry-php-lazy-registry-class/
* @license MIT license
*/
class Lim_Registry {
/**
* Default overwrite entries when being set more than once
* @var boolean
*/
protected $_defaultOverwrite = true;
/**
* Singleton pattern
* @var array
*/
private static $_instances = array();
/**
* Containing all entries
* @var array
*/
protected $_entries = array();
/**
* Protected contructor for singleton protection
*/
protected final function __construct() {
}
/**
* Private clone method for singleton protection
*/
private final function __clone() {
}
/**
* Get instance of (called) class
* @return Lim_Registry
*/
public static function getInstance() {
$class = self::_getClass();
if (empty(self::$_instances[$class]))
self::$_instances[$class] = new $class;
return self::$_instances[$class];
}
/**
* Set default overwriting entries when being set more than once.
* @param boolean $overwrite Optional, else used as a getter
* @return boolean
*/
public static function defaultOverwrite($overwrite = null) {
if ($overwrite !== null)
self::getInstance()->_defaultOverwrite = (bool) $overwrite;
return self::getInstance()->_defaultOverwrite;
}
/**
* Set value of given key
* @param string $key
* @param mixed $value
* @param boolean $overwrite Optional, when set will ignore the default overwrite setting
* @return boolean Value was set succesfully
*/
public static function set($key, $value, $overwrite = null) {
$settings = array('type' => 'value', 'loaded' => true, 'value' => $value);
return self::getInstance()->_setEntry($key, $settings, $overwrite);
}
/**
* Set value by reference (for arrays)
* @param string $key
* @param mixed $value
* @return boolean Value was set succesfully
*/
public static function setByRef($key, & $value) {
$settings = array('type' => 'value', 'loaded' => true, 'value' => & $value);
return self::getInstance()->_setEntry($key, $settings, true);
}
/**
* Set lazy entry of a class. Instance will only be created when entry is requested using the get method.
* @param string $key
* @param string $class
* @param array $args
* @param boolean $overwrite Optional, when set will ignore the default overwrite setting
* @return boolean Value was set succesfully
*/
public static function setLazyClass($key, $class, $args = array(), $overwrite = null) {
$settings = array('type' => 'class', 'class' => $class, 'args' => $args, 'loaded' => false, 'value' => null);
return self::getInstance()->_setEntry($key, $settings, $overwrite);
}
/**
* Set lazy entry of a callback function. Function will only be called when entry is requested using the get method.
* @param string $key
* @param array $callback
* @param array $args
* @param boolean $overwrite Optional, when set will ignore the default overwrite setting
* @return boolean Value was set succesfully
*/
public static function setLazyCallback($key, $callback, $args = array(), $overwrite = null) {
$settings = array('type' => 'callback', 'callback' => $callback, 'args' => $args, 'loaded' => false, 'value' => null);
return self::getInstance()->_setEntry($key, $settings, $overwrite);
}
/**
* Get value of given key
* @param string $key
* @param boolean $reload Reload if class or callback was already loaded
* @return mixed
* @throw Exception
*/
public static function get($key, $reload = false) {
$instance = self::getInstance();
// check if entry exists
if (!key_exists($key, $instance->_entries))
self::_throwException('Key "' . $key . '" could not be found.');
// get current entry
$entry = $instance->_entries[$key];
// check if entry should be loaded or reloaded
if (!$entry['loaded'] || $reload) {
if ($entry['type'] == 'class') {
// get reflection class
$refClass = new ReflectionClass($entry['class']);
// create instance
if (empty($entry['args'])) {
$entry['value'] = $refClass->newInstanceArgs();
} else {
$entry['value'] = $refClass->newInstanceArgs($entry['args']);
}
} else if ($entry['type'] == 'callback') {
// run callback and set return value
$entry['value'] = call_user_func_array($entry['callback'], $entry['args']);
} else {
self::_throwException('Type "' . $type . '" is not supported.');
}
// set (new) value and change "loaded" setting
$instance->_entries[$key]['value'] = $entry['value'];
$instance->_entries[$key]['loaded'] = true;
}
return $entry['value'];
}
/**
* Get value by reference (for arrays)
* @param string $key
* @return mixed By reference
*/
public static function & getByRef($key) {
$instance = self::getInstance();
// check if entry exists
if (!key_exists($key, $instance->_entries))
self::_throwException('Key "' . $key . '" could not be found.');
// get current entry
$entry = $instance->_entries[$key];
return $entry['value'];
}
/**
* Check if given entry exists
* @param string $key
* @return boolean
*/
public static function has($key) {
return key_exists($key, self::getInstance()->_entries);
}
/**
* Check if given (lazy) entry is already loaded
* @param string $key
* @return boolean
*/
public static function isLoaded($key) {
return (self::has($key) && self::getInstance()->_entries[$key]['loaded'] === true);
}
/**
* Remove the given entry
* @param string $key
* @throw Exception
*/
public static function remove($key) {
if (!self::has($key))
self::_throwException('Key "' . $key . '" does not exist.');
unset(self::getInstance()->_entries[$key]);
}
/**
* Remove all entries
*/
public static function clear() {
$keys = array_keys(self::getInstance()->_entries);
foreach ($keys as $key)
self::remove($key);
}
/**
* Set value of given key
* @param string $key
* @param mixed $settings
* @param boolean $overwrite Optional, when set will ignore the default overwrite setting
* @return boolean Value was set succesfully
*/
protected function _setEntry($key, $settings, $overwrite = null) {
// check if overwriting is allowed
$overwrite = ($overwrite === null) ? $this->_defaultOverwrite : $overwrite;
// check if entry exists and overwriting is allowed
if (key_exists($key, $this->_entries) && !$overwrite)
return false;
$this->_entries[$key] = $settings;
return true;
}
/**
* Throw exception
* @param string $msg
* @throw Exception
*/
protected static function _throwException($msg) {
throw new Exception(self::_getClass() . ' - ' . $msg);
}
/**
* get_called_class() equivalent also support for PHP < 5.3.
* @return string
*/
protected static function _getClass() {
if (function_exists('get_called_class'))
return get_called_class();
$class = __CLASS__;
try {
$bt = debug_backtrace();
$l = 0;
do {
$l++;
$lines = file($bt[$l]['file']);
$callerLine = $lines[$bt[$l]['line']-1];
preg_match('/([a-zA-Z0-9\_]+)::'.$bt[$l]['function'].'/', $callerLine, $matches);
} while ($matches[1] === 'parent' && $matches[1]);
if (class_exists($matches[1]))
$class = $matches[1];
} catch (Exception $e) {
}
return $class;
}
} // Lim_Registry
Revision: 25392
Updated Code
at July 24, 2011 21:56 by freelancephp
Updated Code
<?php
/**
* LRegistry Class
*
* Managing globals with the registry pattern.
* This class provides lazy loading functionallity. This means it is possible to
* add a callback or class (with arguments) which will be called or instanciated
* when it is being used for the first time.
*
* @version 1.1
* @author Victor Villaverde Laan
* @link http://www.freelancephp.net/php-lazy-registry-class/
* @license MIT license
*/
class LRegistry {
/**
* Singleton pattern
* @var Registry object
*/
protected static $_instance = NULL;
/**
* Containing all entries
* @var array
*/
protected $_entries = array();
/**
* Default overwrite entries when being set more than once
* @var boolean
*/
protected $_default_overwrite = TRUE;
/**
* Private contructor for singleton protection
*/
private final function __construct() {}
/**
* Private clone method for singleton protection
*/
private final function __clone() {}
/**
* Get instance of this class
* @return Registry object
*/
public static function get_instance() {
if ( self::$_instance === NULL )
self::$_instance = new LRegistry;
return self::$_instance;
}
/**
* Get value of given key
* @param string $key
* @param boolean $reload reload if class or callback was already loaded
* @return mixed
* @throw Exception
*/
public static function get( $key, $reload = FALSE ) {
$instance = self::get_instance();
// check if entry exists
if ( ! key_exists( $key, $instance->_entries ) )
throw new Exception( get_class( self::get_instance() ) . ': Key "' . $key . '" could not be found.' );
// get current entry
$entry = $instance->_entries[$key];
// check if entry should be loaded or reloaded
if ( ! $entry['loaded'] OR $reload ) {
if ( $entry['type'] == 'class' ) {
// get reflection class
$ref_class = new ReflectionClass( $entry['class'] );
// create instance
$entry['value'] = $ref_class->newInstanceArgs( $entry['args'] );
} else if ( $entry['type'] == 'callback' ) {
// run callback and set return value
$entry['value'] = call_user_func_array( $entry['callback'], $entry['args'] );
} else {
throw new Exception( get_class( self::get_instance() ) . ': Type "' . $type . '" is not supported.' );
}
// set (new) value and change "loaded" setting
$instance->_entries[$key]['value'] = $entry['value'];
$instance->_entries[$key]['loaded'] = TRUE;
}
return $entry['value'];
}
/**
* Set value of given key
* @param string $key
* @param mixed $value
* @param boolean $overwrite optional, when set will ignore the default overwrite setting
* @return boolean value was set succesfully
*/
public static function set( $key, $value, $overwrite = NULL ) {
// set normal value settings
$settings = array( 'type' => 'value',
'loaded' => TRUE,
'value' => $value );
return self::get_instance()->_set( $key, $settings, $overwrite );
}
/**
* Set lazy entry of a class. Instance will only be created when entry
* is requested using the get method.
* @param string $key
* @param string $class
* @param array $args
* @param boolean $overwrite optional, when set will ignore the default overwrite setting
* @return boolean value was set succesfully
*/
public static function set_lazy_class( $key, $class, $args = array(), $overwrite = NULL ) {
// set lazy class settings
$settings = array( 'type' => 'class',
'class' => $class,
'args' => $args,
'loaded' => FALSE,
'value' => NULL );
return self::get_instance()->_set( $key, $settings, $overwrite );
}
/**
* Set lazy entry of a callback function.Function will only be called when entry
* is requested using the get method.
* @param string $key
* @param array $callback
* @param array $args
* @param boolean $overwrite optional, when set will ignore the default overwrite setting
* @return boolean value was set succesfully
*/
public static function set_lazy_callback( $key, $callback, $args = array(), $overwrite = NULL ) {
// set lazy callback settings
$settings = array( 'type' => 'callback',
'callback' => $callback,
'args' => $args,
'loaded' => FALSE,
'value' => NULL );
return self::get_instance()->_set( $key, $settings, $overwrite );
}
/**
* Check if given entry exists
* @param string $key
* @return boolean
*/
public static function has( $key ) {
return key_exists( $key, self::get_instance()->_entries );
}
/**
* Check if given (lazy) entry is already loaded
* @param string $key
* @return boolean
*/
public static function is_loaded( $key ) {
return ( self::has( $key ) AND self::get_instance()->_entries[$key]['loaded'] === TRUE );
}
/**
* Remove the given entry
* @param string $key
* @throw Exception
*/
public static function remove( $key ) {
if ( ! self::has( $key ) )
throw new Exception( get_class( self::get_instance() ) . ': Key "' . $key . '"does not exist.' );
unset( self::get_instance()->_entries[$key] );
}
/**
* Set default overwriting entries when being set more than once.
* @param boolean|NULL $overwrite optional, if empty can be used as a getter
* @return boolean
*/
public static function default_overwrite( $overwrite = NULL ) {
if ( $overwrite !== NULL )
self::get_instance()->_default_overwrite = (bool) $overwrite;
return self::get_instance()->_default_overwrite;
}
/**
* Set value of given key (private use)
* @param string $key
* @param mixed $settings
* @param boolean $overwrite optional, when set will ignore the default overwrite setting
* @return boolean value was set succesfully
*/
protected function _set( $key, $settings, $overwrite = NULL ) {
$instance = self::get_instance();
// check if overwriting is allowed
$overwrite = ( $overwrite === NULL )
? $this->_default_overwrite
: $overwrite;
// check if entry exists and overwriting is allowed
if ( key_exists( $key, $this->_entries ) AND ! $overwrite )
return FALSE;
$this->_entries[$key] = $settings;
return TRUE;
}
}
/*?> // ommit closing tag, to prevent unwanted whitespace at the end of the parts generated by the included files */
Revision: 25391
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at March 30, 2010 04:35 by freelancephp
Initial Code
<?php
/**
* LRegistry Class
*
* Managing globals with the registry pattern.
* This class provides lazy loading functionallity. This means it is possible to
* add a callback or class (with arguments) which will be called or instanciated
* when it is being used for the first time.
*
* @version 1.0
* @author Victor Villaverde Laan
* @link http://www.freelancephp.net/php-lazy-registry-class/
* @license MIT license
*/
class LRegistry {
/**
* Singleton pattern
* @var Registry object
*/
private static $_instance = NULL;
/**
* Containing all entries
* @var array
*/
private $_entries = array();
/**
* Default overwrite entries when being set more than once
* @var boolean
*/
private $_default_overwrite = TRUE;
/**
* Private contructer for singleton protection
*/
private final function __construct() {
}
/**
* Private clone method for singleton protection
*/
private final function __clone() {
}
/**
* Get instance of this class
* @return Registry object
*/
public static function get_instance() {
if ( self::$_instance === NULL )
self::$_instance = new LRegistry;
return self::$_instance;
}
/**
* Get value of given key
* @param string $key
* @param boolean $reload reload if class or callback was already loaded
* @return mixed
*/
public static function get( $key, $reload = FALSE ) {
$instance = self::get_instance();
// check if entry exists
if ( ! key_exists( $key, $instance->_entries ) )
$instance->_exception( 'Key "' . $key . '" could not be found.' );
// get current entry
$entry = $instance->_entries[$key];
// check if entry should be loaded or reloaded
if ( ! $entry['loaded'] OR $reload ) {
if ( $entry['type'] == 'class' ) {
// get reflection class
$ref_class = new ReflectionClass( $entry['class'] );
// create instance
$entry['value'] = $ref_class->newInstanceArgs( $entry['args'] );
} else if ( $entry['type'] == 'callback' ) {
// run callback and set return value
$entry['value'] = call_user_func_array( $entry['callback'], $entry['args'] );
} else {
$instance->_exception( 'Type "' . $type . '" is not supported.' );
}
// set (new) value and change "loaded" setting
$instance->_entries[$key]['value'] = $entry['value'];
$instance->_entries[$key]['loaded'] = TRUE;
}
return $entry['value'];
}
/**
* Set value of given key
* @param string $key
* @param mixed $value
* @param boolean $overwrite optional, when set will ignore the default overwrite setting
* @return boolean value was set succesfully
*/
public static function set( $key, $value, $overwrite = NULL ) {
// set normal value settings
$settings = array( 'type' => 'value',
'loaded' => TRUE,
'value' => $value );
return self::get_instance()->_set( $key, $settings, $overwrite );
}
/**
* Set lazy entry of a class. Instance will only be created when entry
* is requested using the get method.
* @param string $key
* @param string $class
* @param array $args
* @param boolean $overwrite optional, when set will ignore the default overwrite setting
* @return boolean value was set succesfully
*/
public static function set_lazy_class( $key, $class, $args = array(), $overwrite = NULL ) {
// set lazy class settings
$settings = array( 'type' => 'class',
'class' => $class,
'args' => $args,
'loaded' => FALSE,
'value' => NULL );
return self::get_instance()->_set( $key, $settings, $overwrite );
}
/**
* Set lazy entry of a callback function.Function will only be called when entry
* is requested using the get method.
* @param string $key
* @param array $callback
* @param array $args
* @param boolean $overwrite optional, when set will ignore the default overwrite setting
* @return boolean value was set succesfully
*/
public static function set_lazy_callback( $key, $callback, $args = array(), $overwrite = NULL ) {
// set lazy callback settings
$settings = array( 'type' => 'callback',
'callback' => $callback,
'args' => $args,
'loaded' => FALSE,
'value' => NULL );
return self::get_instance()->_set( $key, $settings, $overwrite );
}
/**
* Check if given entry exists
* @param string $key
* @return boolean
*/
public static function has( $key ) {
return key_exists( $key, self::get_instance()->_entries );
}
/**
* Check if given (lazy) entry is already loaded
* @param string $key
* @return boolean
*/
public static function is_loaded( $key ) {
return ( self::has( $key ) AND self::get_instance()->_entries[$key]['loaded'] === TRUE );
}
/**
* Remove the given entry
* @param string $key
*/
public static function remove( $key ) {
if ( ! self::has( $key ) )
self::get_instance()->_exception( 'Key "' . $key . '"does not exist.' );
unset( self::get_instance()->_entries[$key] );
}
/**
* Set default overwriting entries when being set more than once.
* @param boolean|NULL $overwrite optional, if empty can be used as a getter
* @return boolean
*/
public static function default_overwrite( $overwrite = NULL ) {
if ( $overwrite !== NULL )
self::get_instance()->_default_overwrite = (bool) $overwrite;
return self::get_instance()->_default_overwrite;
}
/**
* Set value of given key (private use)
* @param string $key
* @param mixed $settings
* @param boolean $overwrite optional, when set will ignore the default overwrite setting
* @return boolean value was set succesfully
*/
protected function _set( $key, $settings, $overwrite = NULL ) {
$instance = self::get_instance();
// check if overwriting is allowed
$overwrite = ( $overwrite === NULL )
? $this->_default_overwrite
: $overwrite;
// check if entry exists and overwriting is allowed
if ( key_exists( $key, $this->_entries ) AND ! $overwrite )
return FALSE;
$this->_entries[$key] = $settings;
return TRUE;
}
/**
* Throw an exception
* @param string $message
*/
protected function _exception( $message ) {
throw new Exception( 'LRegistry: ' . $message );
}
}
/*?> // ommit closing tag, to prevent unwanted whitespace at the end of the parts generated by the included files */
Initial URL
http://www.freelancephp.net/php-lazy-registry-class/
Initial Description
Managing globals with the registry pattern. This class provides lazy loading functionallity. This means it is possible to add a callback or class (with arguments) which will be called or instanciated when it is being used for the first time.
Initial Title
Lim_Registry – PHP Lazy Registry Class
Initial Tags
class, php
Initial Language
PHP