J'ai une question simple. J'utilise un singleton qui implémente une classe abstraite. Est-il possible de mettre la méthode getInstance() et la variable $ _instance dans la classe abstraite au lieu de la concrète que je veux créer?singleton en classe abstraite php
Voici mon code:
<?php
class Command_Log extends Command_Abstract {
private static $_instance=null;
public static function getInstance() {
if (self::$_instance==null)
self::$_instance=new self();
return self::$_instance;
}
protected function realExecute() {
}
protected function realSimulate($fileHandle) {
}
}
et
<?php
abstract class Command_Abstract implements Command_Interface {
protected $_data=array();
//private static $_instance=null;
protected $_isExecuted=false;
protected $_execute=false;
public function enableExecute() {
$this->_execute=true;
return $this;
}
protected function __construct() {
}
protected function __clone() {}
public function addData($data) {
array_push($this->_data,$data);
return $this;
}
abstract protected function realExecute();
abstract protected function realSimulate($fileHandle);
public function execute() {
if(!$this->_isExecuted && $this->_execute) {
$this->_isExecuted = true;
$this->realExecute();
}
}
public function simulate() {
$exitSystem = false;
if(!$this->_isExecuted && $this->_execute) {
$this->_isExecuted = true;
$exitSystem = $this->realSimulate($fh);
}
}
return $exitSystem;
}
}
J'ai de nombreuses implémentations des commandes, donc je ne veux pas de code redondant partout dans mes mises en œuvre. Est-il possible de mettre ces deux choses dans la classe abstraite, si oui s'il vous plaît dites-moi comment.
Si non s'il vous plaît expliquez-moi pourquoi il n'est pas possbile. Ou si j'ai besoin de changer quelque chose pour le faire, de toute façon.
salutations
+1, bien que quand vous dites « il y a des problèmes en php 5.2 », ce que vous entendez est ce » est impossible en PHP 5.2 "! La nouvelle fonctionnalité, pour ceux qui ne le savent pas, est [late static binding] (http://php.net/manual/fr/language.oop5.late-static-bindings.php) et sera très utile dans tous façons de rendre le support de la POO de PHP beaucoup plus flexible. – lonesomeday
effectivement le code est fait pour 5.2 .. j'ai utilisé une fonction qui simule la fonction get_called_class() http://www.septuro.com/2009/07/php-5-2-late-static-binding-get_called_class-and -self-new-self/et au lieu d'utiliser la liaison statique avec self :: initialize j'utilise $ this-> initialize (c'est pourquoi j'ai commenté cette ligne sur la classe Singleton) Je ne suis pas vraiment sûr de faire ça mais cela fonctionne pour 5.2 =) – pleasedontbelong
bien, merci beaucoup, je suis condamné à utiliser 5.2 J'ai utilisé 5.3 featuers déjà comme $ var :: call_method() et je dois le replier sur call_user_func (array ($ var, "call_method ")) comme je me suis rendu compte que j'ai besoin de support pour 5.2. Je vais jeter un oeil si vraiment wann faire cela pour 5.2 avec votre solution. Ne vous méprenez pas, c'est beau, mais peut-être pas la façon dont je veux marcher. :) – evildead