Registry-Muster und verzögerte Instanziierung registrierter Objekte

Stellen wir uns vor, wir haben ein Registrierungsmuster ...

<?php

class Registry
{

private static $objects     = array();
private static $instance    = null;

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

protected function _get($key) {
    return ($this->objects[$key]) ? $this->objects[$key] : null;
}

protected function _set($key, $val) {
    $this->objects[$key] = $val;
}

public static function get($key) {
    return self::getInstance()->_get($key);
}

public static function set($key, $object) {
    return self::getInstance()->_set($key, $object);
}

}
?>

it dieser Erkenntnis ist es wirklich einfach .

<?
Registry::set('db', $db_client);
Registry::set('redis', $redis_client);

//Using registered objects is really easy
Registry::get('db')->query("...");
Registry::get('redis')->get("...");
?>

Aber wie Sie sehen, fügen wir Instanzen zur Registrierung hinzu, auch wenn wir sie nicht benötigen (ja, es geht nur um Leistung). Die Frage ist also, wie man das Registrierungsmuster ändert, um eine verzögerte Instanziierung durchführen zu können.

Hier ist was ich suche ...

<?
class Registry
{

private static $objects     = array();
private static $instance    = null;

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

protected function _db() {
    if (!$this->objects['db']) {
        $this->objects['db'] = new DatabaseAdapter(DB_HOST, DB_NAME, DB_USER, DB_PASSWORD);
    }
    return $this->objects['db'];
}

protected function _redis() {
    if (!$this->objects['redis']) {
        $this->objects['redis'] = new Redis(REDIS_HOST, REDIS_DB, REDIS_USER, REDIS_PASSWORD);
    }
    return $this->objects['redis'];
}

public static function db() {
    return self::getInstance()->_db();
}

public static function redis() {
    return self::getInstance()->_redis();
}

}
?>

Wie du sehen kannst,DatabaseAdapter() oderRedis() wird nur erstellt, wenn wir sie anfordern. Alles scheint in Ordnung zu sein, aber wie Sie sehen, ist es keine eigenständige Klasse, weil_db(), _redis() Methoden enthält Verbindungskonstanten usw. Wie vermeide ich das? Wie kann ich die Registrierungsmethode in der Registrierungsklasse definieren, um die Registrierungsklasse und die darin enthaltenen Objekte zu trennen?

Es tut mir wirklich leid wegen meinem Englisch, aber ich hoffe es ist klar für dich.

Vielen Dank

PS: Der gesamte obige Code wurde 1 Minute lang geschrieben. vor und wurde nicht getestet.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage