Как реализовать Синглетоны на PHP

Сергей Тарасов

Профессор
Как реализовать Синглетоны на PHP

Насколько возможно реализации синглетонов на PHP?

Имеется в виду, что не нужно будет руками каждый раз писать функцию а-ля Instance().
Хотелось бы, как в C++ просто отнаследоваться от класса OnceInstantiated...
 

Сергей Тарасов

Профессор
Все равно там везде приходится переписывать функцию getInstance()

-~{}~ 17.03.07 20:58:

Лучшее, что смог написать пока

PHP:
class Singleton
{
	private static $instance = null;
	protected static function Instance($classname)
	{
		if(is_null(self::$instance))
		{
			self::$instance = new $classname();
		}
		
		return $instance;
	}
}
И соответственно

PHP:
class A extends Singleton
{
	public function __construct()
	{
		/**/
	}
	
	public static function Instance()
	{
		return parent::Instance(__CLASS__);
	}	
}
 

Сергей Тарасов

Профессор
Гравицапа
Да, там это реализуется довольно просто через шаблоны...

>А почему конструктор "паблик"?
А сможет ли базовый класс вызвать закрытую функцию производного?
 

Гравицапа

elbirret elcno
Сергей Тарасов
protected?

-~{}~ 18.03.07 00:50:

Кстати у тебя ошибка в определении класса Singleton.
Какая, я думаю сам найдёшь =)
 

Сергей Тарасов

Профессор
Окончательная версия:

PHP:
class Singleton
{
	private static $instance = null;
	protected static function Instance($classname)
	{
		if(is_null(self::$instance))
		{
			self::$instance = new $classname();
		}
		
		return self::$instance;
	}
}

class A extends Singleton 
{ 
    protected function __construct() 
    { 
        /**/ 
    } 
     
    public static function Instance() 
    { 
        return parent::Instance(__CLASS__); 
    }     
}
 

Сергей Тарасов

Профессор
Угу...
Добавляем:

PHP:
class Singleton
{
	private static $instance = null;
	protected static function Instance($classname)
	{
		if(is_null(self::$instance))
		{
			self::$instance = new $classname();			
		}
		
		return self::$instance;
	}
	
	public final function __clone()
   	{
    	trigger_error('Ошибка клонирования синглетона', E_USER_ERROR);
   	}
}
-~{}~ 18.03.07 17:56:

PHP:
class A extends Singleton
{
	protected function __construct()
	{
		echo "A Construct\n";
	}
	
	public static function Instance()
	{
		return parent::Instance(__CLASS__);
	}
	
	public $A_val = "A Value\n";
}


class B extends Singleton
{
	protected function __construct()
	{
		echo "B Construct\n";
	}
	
	public static function Instance()
	{
		return parent::Instance(__CLASS__);
	}
	
	public $B_val = "B Value\n";
}


echo A::Instance()->A_val . "\n";
echo B::Instance()->B_val . "\n";
Получаю:

Undefined property: A::$B_val

-~{}~ 18.03.07 17:59:

На выходе

A Construct
A Value

-~{}~ 18.03.07 18:03:

Довольно глупая реализация статических пременных класса...

-~{}~ 18.03.07 18:04:

Расширил до

PHP:
class Singleton
{
	private static $instance = array();
	protected static function Instance($classname)
	{
		if(!isset(self::$instance[$classname]))
		{
			self::$instance[$classname] = new $classname();			
		}
		
		return self::$instance[$classname];
	}
	
	public final function __clone()
   	{
    	trigger_error('Ошибка клонирования синглетона', E_USER_ERROR);
   	}
}
Так вроде заработало...
 
Сверху