O (İnsanlar yeni bir tamamen yeni bir nesne anlamına gelir düşünüyorum) anlamak için çok daha zor kodunuzu yapar gibi ben bunu tavsiye etmem. Ama sonra Singletons kullanımını recoemmed olmaz.
Bu kodun temel fikir singleton etrafında sarıcı olmasıdır. Bu sargı aracılığıyla erişilen tüm fonksiyonlar ve değişkenler aslında tekiz etkilemektedir. Aşağıdaki kod sihirli yöntemler ve SPL arayüzleri bir sürü uygulamak değil gibi mükemmel değil ama gerekirse onlar eklenebilir
Code
/**
* Superclass for a wrapper around a singleton implementation
*
* This class provides all the required functionality and avoids having to copy and
* paste code for multiple singletons.
*/
class SingletonWrapper{
private $_instance;
/**
* Ensures only derived classes can be constructed
*
* @param string $c The name of the singleton implementation class
*/
protected function __construct($c){
$this->_instance = &call_user_func(array($c, 'getInstance'));
}
public function __call($name, $args){
call_user_func_array(array($this->_instance, $name), $args);
}
public function __get($name){
return $this->_instance->{$name};
}
public function __set($name, $value){
$this->_instance->{$name} = $value;
}
}
/**
* A test singleton implementation. This shouldn't be constructed and getInstance shouldn't
* be used except by the MySingleton wrapper class.
*/
class MySingletonImpl{
private static $instance = null;
public function &getInstance(){
if ( self::$instance === null ){
self::$instance = new self();
}
return self::$instance;
}
//test functions
public $foo = 1;
public function bar(){
static $var = 1;
echo $var++;
}
}
/**
* A wrapper around the MySingletonImpl class
*/
class MySingleton extends SingletonWrapper{
public function __construct(){
parent::__construct('MySingletonImpl');
}
}
Examples
$s1 = new MySingleton();
echo $s1->foo; //1
$s1->foo = 2;
$s2 = new MySingleton();
echo $s2->foo; //2
$s1->bar(); //1
$s2->bar(); //2