синглтон в абстрактном классе php - PullRequest
2 голосов
/ 08 октября 2010

У меня простой вопрос. Я использую синглтон, который реализует абстрактный класс. Можно ли поместить метод getInstance () и переменную $ _instance в абстрактный класс вместо конкретного, который я хочу создать?

Вот мой код:

<?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) {
    }

}

и

<?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;
    }

}

У меня много реализаций команд, поэтому я не хочу, чтобы в моих реализациях везде был избыточный код. Можно ли поместить эти две вещи в абстрактный класс, если да, скажите, пожалуйста, как.

Если нет, пожалуйста, объясните мне, почему это невозможно. Или, во всяком случае, если мне нужно что-то изменить, чтобы это сделать.

С уважением

1 Ответ

3 голосов
/ 08 октября 2010

ДА МЫ МОЖЕМ!

У меня есть класс с именем Singleton, который является абстрактным ... и много классов, расширяющих этот класс Singleton ... это код:

abstract class Singleton {

    private static $instances = array();

    final private function __construct($_params) {
        $class = get_called_class();
        if (array_key_exists($class, self::$instances))
            throw new Exception('An instance of '. $class .' already exists !');

        //static::initialize(); //In PHP 5.3
        $this->initialize($_params); 
    }
    final private function __clone() { }

    abstract protected function initialize();

    public static function getInstance($_params=array()) {
        $class = get_called_class();
        if (array_key_exists($class, self::$instances) === false){
            self::$instances[$class] = new $class($_params);
        } 
        return self::$instances[$class];
    }
}

и (например) классDBConnection, выходящий из Singleton

class DBConnection extends Singleton{

    private $connexion_pdo=null;

    protected function initialize(){
             //connect to the DB
        $this->connexion_pdo = blablalba;
    }
}

, хотя в php 5.2 есть некоторые проблемы, особенно с функцией get_called_class() и static::initialize()

. Вы также можете проверитьСайт php для шаблонов ... есть много материалов для синглтона

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...