<?php
	
	class Registry implements ArrayAccess, Iterator, Countable {
		
		private $globals;
		
		// Magic methods
		public function __construct() {
			$this->globals = array();
			
		}
		
		public function __destruct() {
		}
		
		public function __get( $key ) {
			return $this->offsetGet ( $key );
		}
		
		public function __set ( $key, $value ) {
			$this->offsetSet ( $key, $value );
		}
		
		public static function getInstance() {
			static $instance;
			
			if (! is_object ( $instance ) ) {
				$obj = __CLASS__;
				$instance = new $obj;
			}
			
			return $instance;
			
		}
		
		// CLASS METHODS
		
		// Voegt een nieuw element toe aan de $this->globals array
		public function add ( $global, $key = '' ) {
			
			if ( strlen ($key) > 0 ) {
				
				if ( ! $this->offsetExists ( $key ) ) {
					$this->globals [ $key ] = &$global;
				
				} else {
					throw new Exception("Duplicate etry found");
				
				}
			
			} else {
				$this->globals[] = &$global;
			
			}
			
		}
		
		// Verwijder een element uit de globals array
		public function delete ( $key ) {
			
			$this->offsetUnset ( $key );
				
		}
		
		// Verwijder alle elementen uit de globals array
		public function clear () {
			
			$this->globals = array();
			
		}
		
		// Geef het een bepaald element terug
		public function get ( $offset ) {
			return $this->offsetGet ( $offset );
		}
		
		
		// IMPLEMENTATIONS
		
		//-- ArrayAccess
		public function offsetExists ( $offset ) {
			return isset ( $this->globals [ $offset ] );
		}
		
		public function offsetGet ( $offset ) {
			
			if ( $this->offsetExists ( $offset ) ) {
				return $this->globals [ $offset ];
			
			} else {
				throw new RangeException("Index out of bounds");
			
			}
			
		}
		
		public function offsetSet ( $offset, $value ) {
			
			if ( $this->offsetExists ( $offset ) ) {
				$this->globals [ $offset ] = &$value;
			
			} else {
				throw new RangeException("Index out of bounds");
			
			}
			
		}
		
		public function offsetUnset ( $offset ) {
			
			if ( $this->offsetExists ( $offset ) ) {
				unset ( $this->globals [ $offset ] );
			
			} else {
				throw new RangeException("Index out of bounds");
			
			}
			
		}
		
		//-- Iterator
		public function current() {
			return current ( $this->globals );
			
		}
		
		public function next() {
			return next ( $this->globals );
			
		}
		
		public function key() {
			return key ( $this->globals );
			
		}
		
		public function rewind() {
			reset ( $this->globals );
			
		}
		
		public function valid() {
			return $this->current() !== false;
			
		}
		
		//-- Countable
		public function count () {
			return count ( $this->globals );
		
		}
		
	}

?>

Wat voorbeelden van hoe te gebruiken:

<?php
	$reg = Registry::getInstance();
	
	$reg->add ( $db, 'database' );
	$reg->add ( $user, 'user' );
	$reg->add ( $template, 'template' );
	
	echo $reg->database;
	echo $reg->user;
	echo $reg['template'];
	
	foreach ( $reg as $t ) {
		echo $t;
	}
	
	class blaat {
		private $db;
		
		public function __construct() {
			$this->db = Registry::getInstance()->database;
			$this->user = Registry::getInstance()->get ('user');
		}
		
		public function blabla () {
			$reg = Registry::getInstance();
			$reg['db']->query();
		}
	}
?>
 