Как создать подкласс Singleton в PHP? - PullRequest
6 голосов
/ 03 ноября 2011

Я пытаюсь создать подкласс класса, который использует шаблон синглтона, и заполнить экземпляр подклассом.

Кажется, у меня возникли небольшие проблемы.

class Singleton {

    static private $instance;

    static public function instance(){
        if(is_null(self::$instance)){
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __construct(){}

}

class MySingleton extends Singleton {

}

echo get_class(MySingleton::instance()); //=> Singleton

//=> I'm hoping to see MySingleton

Ответы [ 3 ]

8 голосов
/ 03 ноября 2011

Что вам нужно, так это поздняя статическая привязка , которая является новой функцией PHP 5.3.Попробуйте заменить new self() на new static(), и это должно работать для вас.

self всегда ссылается на содержащий класс, тогда как static ссылается на "вызываемый" класс.

1 голос
/ 01 декабря 2011

это работает

<?php

class Singleton {

    static private $instance;
    static public function instance(){
        static $instance = null;  
        return $instance ?: $instance = new static;
    }

    public function __construct(){}

}

class MySingleton extends Singleton {
}

Но я рекомендую следующее:

<?php
class Singleton {

    static protected $instance;              //should not be private

    static public function instance(){
        if(is_null(static::$instance)){         
            static::$instance = new static();
        }
        return static::$instance;

    }

    public function __construct(){}

}

class MySingleton extends Singleton {
    static protected $instance;    //must explicitly declared
}
1 голос
/ 03 ноября 2011

Ваш базовый класс синглтона предотвращает это как есть.если вы измените код на этот, он будет работать.

<?php


class Singleton {

    static private $instances = array();

    static public function instance(){
        $class = get_called_class();
        if(!isset(self::$instances[$class])){
            self::$instances[$class] = new $class();
        }
        return self::$instances[$class];
    }

    private function __construct(){}

}

class MySingleton extends Singleton {

}

echo get_class(MySingleton::instance()); //=> MySingleton

Теперь он работает, потому что Singleton допускает один экземпляр для дочернего класса.

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