198 lines
5.5 KiB
PHP
198 lines
5.5 KiB
PHP
<?php
|
|
/**
|
|
* Zeed Platform Project
|
|
* Based on Zeed Framework & Zend Framework.
|
|
*
|
|
* BTS - Billing Transaction Service
|
|
* CAS - Central Authentication Service
|
|
*
|
|
* LICENSE
|
|
* http://www.zeed.com.cn/license/
|
|
*
|
|
* @category Zeed
|
|
* @package Zeed_Registry
|
|
* @copyright Copyright (c) 2010 Zeed Technologies PRC Inc. (http://www.zeed.com.cn)
|
|
* @author Zeed Team (http://blog.zeed.com.cn)
|
|
* @since 2010-6-30
|
|
* @version SVN: $Id: Registry.php 6710 2010-09-08 13:51:53Z xsharp $
|
|
*/
|
|
|
|
/**
|
|
* 拷贝自Zend_Registry
|
|
*/
|
|
class Zeed_Registry extends ArrayObject
|
|
{
|
|
/**
|
|
* Class name of the singleton registry object.
|
|
* @var string
|
|
*/
|
|
private static $_registryClassName = 'Zeed_Registry';
|
|
|
|
/**
|
|
* Registry object provides storage for shared objects.
|
|
* @var Zeed_Registry
|
|
*/
|
|
private static $_registry = null;
|
|
|
|
/**
|
|
* Retrieves the default registry instance.
|
|
*
|
|
* @return Zeed_Registry
|
|
*/
|
|
public static function getInstance()
|
|
{
|
|
if (self::$_registry === null) {
|
|
self::init();
|
|
}
|
|
|
|
return self::$_registry;
|
|
}
|
|
|
|
/**
|
|
* Set the default registry instance to a specified instance.
|
|
*
|
|
* @param Zeed_Registry $registry An object instance of type Zeed_Registry,
|
|
* or a subclass.
|
|
* @return void
|
|
* @throws Zeed_Exception if registry is already initialized.
|
|
*/
|
|
public static function setInstance(Zeed_Registry $registry)
|
|
{
|
|
if (self::$_registry !== null) {
|
|
throw new Zeed_Exception('Registry is already initialized');
|
|
}
|
|
|
|
self::setClassName(get_class($registry));
|
|
self::$_registry = $registry;
|
|
}
|
|
|
|
/**
|
|
* Initialize the default registry instance.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected static function init()
|
|
{
|
|
self::setInstance(new self::$_registryClassName());
|
|
}
|
|
|
|
/**
|
|
* Set the class name to use for the default registry instance.
|
|
* Does not affect the currently initialized instance, it only applies
|
|
* for the next time you instantiate.
|
|
*
|
|
* @param string $registryClassName
|
|
* @return void
|
|
* @throws Zeed_Exception if the registry is initialized or if the
|
|
* class name is not valid.
|
|
*/
|
|
public static function setClassName($registryClassName = 'Zeed_Registry')
|
|
{
|
|
if (self::$_registry !== null) {
|
|
throw new Zeed_Exception('Registry is already initialized');
|
|
}
|
|
|
|
if (! is_string($registryClassName)) {
|
|
throw new Zeed_Exception("Argument is not a class name");
|
|
}
|
|
|
|
/**
|
|
* @see Zeed_Loader
|
|
*/
|
|
if (! class_exists($registryClassName)) {
|
|
Zeed_Loader::loadClass($registryClassName);
|
|
}
|
|
|
|
self::$_registryClassName = $registryClassName;
|
|
}
|
|
|
|
/**
|
|
* Unset the default registry instance.
|
|
* Primarily used in tearDown() in unit tests.
|
|
* @returns void
|
|
*/
|
|
public static function _unsetInstance()
|
|
{
|
|
self::$_registry = null;
|
|
}
|
|
|
|
/**
|
|
* getter method, basically same as offsetGet().
|
|
*
|
|
* This method can be called from an object of type Zeed_Registry, or it
|
|
* can be called statically. In the latter case, it uses the default
|
|
* static instance stored in the class.
|
|
*
|
|
* @param string $index - get the value associated with $index
|
|
* @return mixed
|
|
* @throws Zeed_Exception if no entry is registerd for $index.
|
|
*/
|
|
public static function get($index)
|
|
{
|
|
$instance = self::getInstance();
|
|
|
|
if (! $instance->offsetExists($index)) {
|
|
throw new Zeed_Exception("No entry is registered for key '$index'");
|
|
}
|
|
|
|
return $instance->offsetGet($index);
|
|
}
|
|
|
|
/**
|
|
* setter method, basically same as offsetSet().
|
|
*
|
|
* This method can be called from an object of type Zeed_Registry, or it
|
|
* can be called statically. In the latter case, it uses the default
|
|
* static instance stored in the class.
|
|
*
|
|
* @param string $index The location in the ArrayObject in which to store
|
|
* the value.
|
|
* @param mixed $value The object to store in the ArrayObject.
|
|
* @return void
|
|
*/
|
|
public static function set($index,$value)
|
|
{
|
|
$instance = self::getInstance();
|
|
$instance->offsetSet($index, $value);
|
|
}
|
|
|
|
/**
|
|
* Returns TRUE if the $index is a named value in the registry,
|
|
* or FALSE if $index was not found in the registry.
|
|
*
|
|
* @param string $index
|
|
* @return boolean
|
|
*/
|
|
public static function isRegistered($index)
|
|
{
|
|
if (self::$_registry === null) {
|
|
return false;
|
|
}
|
|
return self::$_registry->offsetExists($index);
|
|
}
|
|
|
|
/**
|
|
* Constructs a parent ArrayObject with default
|
|
* ARRAY_AS_PROPS to allow acces as an object
|
|
*
|
|
* @param array $array data array
|
|
* @param integer $flags ArrayObject flags
|
|
*/
|
|
public function __construct($array = array(),$flags = parent::ARRAY_AS_PROPS)
|
|
{
|
|
parent::__construct($array, $flags);
|
|
}
|
|
|
|
/**
|
|
* @param string $index
|
|
* @returns mixed
|
|
*
|
|
* Workaround for http://bugs.php.net/bug.php?id=40442 (ZF-960).
|
|
*/
|
|
public function offsetExists($index)
|
|
{
|
|
return array_key_exists($index, $this);
|
|
}
|
|
|
|
}
|