Можно ли определить интерфейс Singleton в PHP? - PullRequest
4 голосов
/ 19 августа 2010

Я хочу определить базовый тип Singleton, из которого пользователь будет извлекать свои классы, поэтому я подумал:


interface SingletonInterface {
    public static function getInstance();
}

abstract class SingletonAbstract implements SingletonInterface {
    abstract protected function __construct();
    final private function __clone() {}
}

Но, используя этот подход, пользователь может реализовать этот синглтон ...


class BadImpl implements SingletonInterface {
    public static function getInstance() {
        return new self;
    }
}

Каким был бы твой подход?

Ответы [ 4 ]

3 голосов
/ 19 августа 2010

Помните, что PHP не допускает множественного наследования, поэтому вы должны тщательно выбирать, на чем основаны ваши классы. Синглтон настолько прост в реализации, что, вероятно, лучше позволить каждому классу определять его. Также помните, что закрытые поля не переносятся в классы-потомки, и поэтому вы можете иметь два разных поля с одинаковыми именами.

3 голосов
/ 19 августа 2010

Я использую этот код для создания Singleton:

abstract class Singleton {

    private static $_aInstance = array();


    private function __construct() {}

    public static function getInstance() {

       $sClassName = get_called_class(); 

       if( !isset( self::$_aInstance[ $sClassName ] ) ) {

          self::$_aInstance[ $sClassName ] = new $sClassName();
       }
       $oInstance = self::$_aInstance[ $sClassName ];

       return $oInstance;
    }

    final private function __clone() {}
}

Это использование этого шаблона:

class Example extends Singleton {
   ...
}

$oExample1 = Example::getInstance();
$oExample2 = Example::getInstance();

if(is_a( $oExample1, 'Example' ) && $oExample1 === $oExample2){

    echo 'Same';

} else {

    echo 'Different';
}
0 голосов
/ 13 февраля 2013

Теперь вы можете использовать черты, но нужно ли вам так много одиночных?

0 голосов
/ 22 августа 2010

Прежде всего: если у вас так много синглетонов в проекте, вы, вероятно, что-то напутали на уровне проекции

Во-вторых: Singleton следует использовать там и только там, где более одного экземпляра класса не имеет никакого смысла или может вызвать некоторые ошибки

Наконец: наследование не предназначено для уменьшения количества кода

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