27-06-2010, 03:18 PM
A partir de php 5.3, tu peux utiliser le "Late Static Bindings". En gros ça te permet d'avoir le nom de la classe appelé durant l'exécution avec le mot clé static.
On remarquera que l'exemple utilise le nouvel opérateur ternaire qui permettre d'omettre la partie centrale.
Sinon tu peux utiliser get_called_class :
Il y a d'autres possibilités, par contre ne pas confondre le singleton et le factory.
Si t'as factory est unique ou héritée, alors elle ne sert pas à instancier d'autres classes.
La tu as uniquement un singleton, d'après tes explications. Avec plus de code on pourrait surement mieux cibler le besoin.
On remarquera que l'exemple utilise le nouvel opérateur ternaire qui permettre d'omettre la partie centrale.
abstract class Singleton
{
protected function __construct() {}
final private function __clone() {}
final static public function getInstance()
{
static $instance = null;
return $instance ?: $instance = new static;
}
}
class Test extends Singleton
{
public function test()
{
echo __CLASS__ . PHP_EOL;
}
}
$test = Test::getInstance();
Sinon tu peux utiliser get_called_class :
class Singleton
{
static $instance = array();
protected function __construct() {}
final private function __clone() {}
final static public function getInstance()
{
$class = get_called_class();
if( ! isset( self::$instances[$c] ) )
{
self::$instances[$class] = new $class;
}
return self::$instances[$class];
}
}
class Test extends Singleton
{
public function test()
{
echo __CLASS__ . PHP_EOL;
}
}
$test = Test::getInstance();
Il y a d'autres possibilités, par contre ne pas confondre le singleton et le factory.
Si t'as factory est unique ou héritée, alors elle ne sert pas à instancier d'autres classes.
La tu as uniquement un singleton, d'après tes explications. Avec plus de code on pourrait surement mieux cibler le besoin.