Page 1 sur 1

Classe Singleton Factory pour les fans de Singleton

Posté : 18 févr. 2011, 17:17
par stealth35
Hello, voiçi une petite classe toute simple pour faire du Singleton avec n'importe quelle classe native à PHP,
il suffit de faire :
Singleton::NomDeLaClasse('les', 'parametres', 'du', '__construct')->LaMethode();
Une fois instancié vous pouvez toujours la récupérer via
Singleton::NomDeLaClasse()->LaMethode();
La classe Singleton (PHP 5.3) :
class Singleton
{
    protected static $_instances;
   
    public static function __callStatic($name, array $arguments)
    {    
        if(empty(static::$_instances[$name]) || !empty($arguments))
        {
        	if(strpos($name, '\\') === 0)
        	{
            	$name = substr($name, 1);
        	}
        	
        	$classname = '\\' . $name;

            if(method_exists($classname, '__construct'))
            {
                $class = new \ReflectionClass($classname);
                static::$_instances[$name] = $class->newInstanceArgs($arguments);
            }
            else
            {
                static::$_instances[$name] = new \$classname;
            }
        }

        return static::$_instances[$name];
    }
}
On pourrait appeler la class "_" pour plus de simplicité :
$dom = _::DOMDocument();

Re: Classe Singleton Factory pour les fans de Singleton

Posté : 18 févr. 2011, 22:58
par BaLiSTiK
Je n ai jamais vraiment compris le principe et l utilité d utilisation du Singleton. Un éclairage pas trop technique est-il possible ^^ ?

Re: Classe Singleton Factory pour les fans de Singleton

Posté : 18 févr. 2011, 23:23
par stealth35
Je n ai jamais vraiment compris le principe et l utilité d utilisation du Singleton. Un éclairage pas trop technique est-il possible ^^ ?
c'est pour éviter d'instancier un objet c'est plus court de faire :
$link = DOMDocument()->getInstance->loadHTMLFile($file)->getElementsByTagName('a');
que
$doc = new DOMDocument();
$link = $doc->loadHTMLFile($file)->getElementsByTagName('a');
de plus la classe fait aussi office de Registry :wink:

si tu veux plus d'info sur les design pattern : http://www.php.net/manual/fr/language.oop5.patterns.php
regarde surtout au niveau de Factory ca prend plus de sens

un très bon exemple est Doctrine ou pour récupérer par un utilisateur tu fera juste :
Doctrine_Core::getTable('user')->find(1);
on va dire que c'est de la simplification, pas besoin d'instancier X fois une base de données.

Re: Classe Singleton Factory pour les fans de Singleton

Posté : 19 févr. 2011, 01:32
par zeus
C'est pas que ça "évite d'instancier l'objet", puisque l'instanciation se fait un interne.
C'est surtout que ça permet de travailler sur une unique instance (unique = single => singleton) de la classe. Quand il y a des couts important à l'instanciation (connexion à la base de données, par exemple), il est préférable de limiter le nombre d'instance, donc de passer par un singleton.