Будет ли работать класс реестра в PHP? - PullRequest
2 голосов
/ 24 января 2010

Если я создаю объект реестра для хранения других объектов и настроек, как это ...

$registry = Registry::getInstance();

А затем создайте 2 других объекта и передайте в них объект Registry, как показано ниже ...

$core = new core($registry);
$database = Database::getInstance($registry);

, а затем позже в сценарии я добавляю некоторые объекты в объект реестра ...

// Store some Objects into our Registry object using a Registry Pattern
$registry->storeObject("database", $database);
$registry->storeObject("session", $session);
$registry->storeObject("cache", $cache);
$registry->storeObject("user", $user);

Будут ли методы в объектах ядра и базы данных, которые были созданы сверху, по-прежнему иметь доступ ко всем объектам, которые я храню в реестре, даже если другие объекты были сохранены в реестре ПОСЛЕ создания объектов ядра и базы данных?

Ответы [ 4 ]

1 голос
/ 24 января 2010

Да, у них будет доступ к этим объектам, но Реестр IMO здесь не лучшее решение - контекст будет намного лучше, поскольку он позволяет моделировать каждое свойство. Это также дает вам 100% уверенность в том, что при вызове $registry->get('user') какой-то User объект будет возвращен.

Контекст очень похож на Registry:

class Context {
    protected $database;
    protected $user;
    protected $logger;

    public function setDatabse(PDO $database) {
       $this->database = $database;
    }

    public function getDatabase() {
       return $this->database;
    }

    public function setLogger(Logger $logger) {
       if ($logger instanceof MySpecificLogger) {
          // do sth
       }

       $this->logger = $logger;
    }

    // rest of setters/getters
}

И когда вы будете использовать его позже:

$db = $contextObject->getDatabase();

Когда вы используете Registry, у вас нет 100% уверенности, что $ db будет тогда объектом PDO (в этом примере), что может вызвать некоторые проблемы в некоторых ситуациях.

1 голос
/ 24 января 2010

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

Тем не менее, я полагаю, что ваш реестр является единственным, верно? Так что да.

edit: может быть, я не понимаю ваш вопрос ....

1 голос
/ 24 января 2010

да, объекты будут передаваться по ссылке (в php> = 5), поэтому каждая переменная будет ссылаться на один и тот же базовый объект.

в старом php, вам нужно пройти мимо ref:

$obj->registry =& $registry;

function f(& $registry) { // $registry is a reference }

ключ в php <5 - это синтаксис амперсанда при назначении и в объявлениях функций. </p>

0 голосов
/ 24 января 2010

Нет, не по умолчанию. Параметры передаются по значению в PHP практически в каждом случае. То, что вы хотите, называется «передача по ссылке», о которой вы можете прочитать больше о в руководстве .

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