2010-03-07 5 views
0

J'écris une classe d'usine qui devrait être capable de renvoyer des instances singleton d'un certain nombre de types différents, en fonction du paramètre donné. La méthode ressemblerait à quelque chose comme ça, mais la façon dont je fais référence méthode statique du singleton est évidemment faux:Comment référencer une méthode statique d'une classe variable en PHP?

public function getService($singletonClassName) { 
    return $singletonClassName::getInstance(); 
} 

Quelle serait la syntaxe correcte pour un tel regard de référence comme en PHP?

Répondre

1

Vous ne pouvez pas utiliser ce type de syntaxe avec PHP < 5.3: c'est l'un des nouvelles fonctionnalités de PHP 5.3

Quelques possibilités, avec PHP 5.2, serait de:

  • utiliser le nom de la classe, si vous le connaissez
  • Ou utilisez quelque chose comme call_user_func


Dans le premier cas, il serait aussi simple que:

ClassName::getInstance() 

Et, dans le second, vous utiliseriez quelque chose comme:

call_user_func($singletonClassName .'::getInstance'); 

Selon la documentation de call_user_func, cela devrait fonctionner avec PHP> = 5.2.3

Ou vous pouvez simplement utiliser:

call_user_func(array($singletonClassName, 'getInstance')); 
+0

* tousse * * tousse * Cinq minutes :) – Gordon

+0

Quand j'ai commencé ma réponse ecriture, le vôtre n'a pas été aussi complet qu'il est maintenant ^^ * (il n'y avait que la première partie o f la réponse, avec le nom de la classe codée en dur) - et nous avons tous les deux édité plusieurs fois ^^ * –

+0

En fait, j'ai appris le truc shoot-early-then-add-stuff de vous. J'ai remarqué que vous faites cela plusieurs fois et je l'ai trouvé très rusé :) – Gordon

0

Vous venez d'utiliser le nom de classe

public function getService($singletonClassName) { 
    return SingletonClassName::getInstance(); 
} 

Par ailleurs, si $singleClassName est une variable contenant l'utilisation classname

public function getService($singletonClassName) { 
    return call_user_func(array($singletonClassName, 'getInstance')); 
} 

Au 5.2.3, vous pouvez également faire

call_user_func($singletonClassName .'::getInstance'); // As of 5.2.3 
Questions connexes