- class Fruit {
- private static $instanceMap = array();
- //protected getter for singleton instances
- protected static function getSingleton($className)
- {
- //保证单例模式 并且不能从控制器实例化和克隆
- if(!isset(self::$instanceMap[$className]))
- {
- $object = new $className;
- //Make sure this object inherit from Singleton
- if($object instanceof Fruit)
- {
- self::$instanceMap[$className] = $object;
- var_dump($object);
- }
- else
- {
- throw SingletonException("Class '$className' do not inherit from Singleton!");
- }
- }
- return self::$instanceMap[$className];
- }
- //protected constructor to prevent outside instantiation
- protected function __construct(){
- }
- //denie cloning of singleton objects
- public final function __clone(){
- trigger_error('It is impossible to clone singleton', E_USER_ERROR);
- }
- }
- class Apple extends Fruit {
- protected $rndId;
- public function __construct(){
- $this->rndId = rand();
- }
- public function whatAmI(){
- echo 'I am a Apple('.$this->rndId.')<br />';
- }
- public static function getInstance(){
- //echo get_class();
- return Fruit::getSingleton(get_class());
- }
- }
- class GreenApple extends Apple {
- public function whatAmI(){
- echo 'I am a GreenApple('.$this->rndId.')<br />';
- }
- public static function getInstance(){
- return Fruit::getSingleton(get_class());
- }
- }
- $apple1 = Apple::getInstance();
- //var_dump($apple1);
- $apple2 = GreenApple::getInstance();
- $apple1->whatAmI();// should echo 'I am a Apple(some number)
- $apple2->whatAmI();// should echo 'I am a GreenApple(some number)
- $apple1 = Apple::getInstance();
- $apple2 = GreenApple::getInstance();
- //保证单例模式
- $apple1->whatAmI();// should echo 'I am a Apple(same number as above)
- $apple2->whatAmI();// should echo 'I am a GreenApple(same number as above)
- // $a = clone $apple1;// this should fail
- // $b = clone $apple2;// this should fail
- //该片段来自于http://www.codesnippet.cn/detail/111020136354.html
来源: http://www.codesnippet.cn/detail/111020136354.html