Синглтон провал.Инициирует другой объект в include_once (somescript.php) - PullRequest
2 голосов
/ 28 июня 2010

Я использую PHP-синглтон из Википедии.Проблема состоит в том, что в синглтоне есть метод, который загружает и запускает другие скрипты PHP через require once, и когда эти скрипты запускаются и реализуют метод класса get_shared_instance, инициируется новый синглтон.Почему это?И что обходится?

синглтон (в базовой форме):

class Controller {

    protected static $shared_instance;

    public static function get_shared_instance()
    {
        if (self::$shared_instance === NULL) { 
            self::$shared_instance = new self();
        } 

        return self::$shared_instance;
    }

/// Constructor made private to be used with singleton.
final protected function __construct(){ $this->initiate(); }

/// Do not allow the clone operation: $x = clone $v;    
final protected function __clone() { }

метод синглтона, который загружает другие файлы

private function settings_by_domain()
{
    $current_domain = $_SERVER['HTTP_HOST'];
    $path = pathinfo(__FILE__, $options = PATHINFO_DIRNAME);
    $settings_file = $path.'/'.$current_domain.'.php';

    if (is_file($settings_file))
    {
        $this->settings_file = $settings_file;
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

Требуетсяфайл содержит:

$c = self::get_shared_instance();

который, к сожалению, при запуске создает новый экземпляр?

Большое спасибо Росс

Ответы [ 2 ]

1 голос
/ 28 июня 2010

Кажется круговой зависимостью: функция get_shared_instance() вызывает конструктор, который вызывает initiate(), который, в вашем случае, вызывает settings_by_domain().Внутри последнего вызывается get_shared_instance(), но вы все еще внутри конструктора, так что статическое поле $shared_instance еще не создано.

Без всего кода трудно предложить решение,но я предлагаю вам проверить взаимные зависимости различных классов и попытаться рационализировать это.В конце концов, почему синглтон зависит от файла, для работы которого нужен сам синглтон?

0 голосов
/ 28 июня 2010
class Controller {

protected static $shared_instance;

public static function get_shared_instance()
{
    if (self::$shared_instance === NULL) { 
    self::$shared_instance = new self();
} 

return self::$shared_instance;

}

возврат в области видимости? это совершенно неправильно. Должно быть:

class Controller {

protected static $shared_instance;

public static function get_shared_instance()
{
    if (self::$shared_instance === NULL) { 
    self::$shared_instance = new self();
    return self::$shared_instance;
} 

}

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