Экземпляр синглтона var не равен нулю при инициализации - PullRequest
2 голосов
/ 27 июля 2011

возможно, уже поздно или что-то в этом роде, но меня это бесит. По сути, я пишу фреймворк для упражнения, пытаясь развить свои навыки, но я вроде застрял. Я думаю, что я, может быть, попал в новичка, о котором я просто не знаю :)

Итак, у меня есть класс начальной загрузки, который инициализирует всю программу. Я создаю контроллер, в котором вы можете вызвать приложение (или модель, если хотите). Все контроллеры и приложения являются подклассами класса инициализации, который реализует шаблон синглтона. Это потому, что я хотел бы использовать функцию конструкции для других вещей инициализации, основанных на данном контроллере / приложении.

Теперь проблема в том, что, когда я пытаюсь запустить приложение из контроллера, экземпляр var уже настроен на объект контроллера (который я считал нулевым). Если я не достаточно ясен, вот код в очень упрощенной и простой форме:

<?php

final class Bootstrap {
    public function __construct() {
        $controller = Controller::init();
        $controller->index();
    }
}

abstract class Initialization {
    private static $_instance = NULL;

    final public static function init() {
        $c = get_called_class();

        var_dump(self::$_instance);

        self::$_instance = new $c();

        return self::$_instance;
    }

    final protected function app($app) {
        $app::init();
    }
}

final class Form extends Initialization { }

final class Controller extends Initialization {
    final public function Index() {
        $this->app('form');
    }
}

$bootstrap = new Bootstrap();

?>

Выход

null
object(Controller)[2]

Я в замешательстве, почему экземпляр уже установлен в приложении формы? Я думал, что он унаследовал это "собственный" статический экземпляр var ??

1 Ответ

3 голосов
/ 27 июля 2011

Вы получаете ваш «собственный» статический экземпляр var, только если вы вызываете его с поздним статическим связыванием, например static::$_instance вместо self::$_instance.Кроме того, вы бы хотели сделать его protected вместо private.

self:: определяется во время компиляции, так сказать, поэтому всегда будет ссылаться на Initialization::$_instance, независимо от того, какой класс его расширяетВы называете это.static:: определяется во время работы программы.

Изменения кода:

abstract class Initialization {
    protected static $_instance = NULL;

    final public static function init() {
        $c = get_called_class();
        static::$_instance = new $c();
        return static::$_instance;
    }
...