Heim >Backend-Entwicklung >PHP-Tutorial >Registrierung der PHP-Architektur

Registrierung der PHP-Architektur

巴扎黑
巴扎黑Original
2016-11-12 11:26:241675Durchsuche

Was ist der Registrierungsmodus? Es ist eigentlich ganz einfach!

Die Rolle der Registrierung besteht darin, Objektzugriffsfunktionen auf Systemebene bereitzustellen. Beim Codieren gehen wir oft davon aus, dass globale Variablen schlecht sind. Allerdings hat alles zwei Seiten und der globale Datenzugriff ist sehr attraktiv.

Hier kommt das Problem:

Die meisten Systeme sind in mehrere Schichten unterteilt, und jede Schicht kommuniziert nur über vordefinierte Kanäle mit benachbarten Schichten. Durch die gemeinsame Nutzung von Ebenen wird das Programm flexibler, und durch das Ersetzen oder Ändern jeder Ebene können die Auswirkungen auf andere Teile des Systems minimiert werden. Aber was ist, wenn Sie Informationen in einer Ebene benötigen, die nicht an eine andere Ebene angrenzt?

Option 1: Übergeben Sie Kontextinformationen von einem Objekt an ein anderes erforderliches Objekt über die Verbindung zwischen den Schichten des Systems: Übergeben Sie diese Informationen von einem Objekt an ein anderes Objekt im System, von einem für die Verarbeitung verantwortlichen Controller Das Objekt wird an das Objekt in der Geschäftslogikschicht und dann an das Objekt übergeben, das für die Kommunikation mit der Datenbank verantwortlich ist. Natürlich können Sie auch das ApplicationHelper-Objekt oder ein bestimmtes Context-Objekt übergeben.

Option 2: Die Schnittstellen aller Objekte müssen geändert werden, um festzustellen, ob die Kontextobjekte ihren Anforderungen entsprechen. Offensichtlich unterbricht dieser Ansatz manchmal die lose Kopplung.

Option 3: Über den Registrierungsmodus. Registrierungsklassen stellen statische Methoden (oder Instanziierungsmethoden von Singleton-Objekten) bereit, um anderen Objekten den Zugriff auf die darin enthaltenen Daten (normalerweise Objekte) zu ermöglichen. Auf diese Datenobjekte kann jedes Objekt im gesamten System zugreifen.

Berücksichtigen Sie den Umfang von PHP, bevor Sie es implementieren:

Der Umfang wird normalerweise verwendet, um das sichtbare Programm von Objekten oder Werten im Code zu beschreiben. Der Lebenszyklus von Variablen kann zeitlich gemessen werden . Die Rolle von Variablen Es gibt 3 Ebenen von Domänen.

1. HTTP-Anfragebereich

bezieht sich auf den Zyklus vom Anfang bis zum Ende einer HTTP-Anfrage.

2. Sitzungsbereich

PHP verfügt über integrierte Unterstützung für Sitzungsvariablen. Am Ende einer Anfrage werden die Sitzungsvariablen serialisiert und im Dateisystem oder in der Datenbank gespeichert und dann zu Beginn der nächsten Anfrage abgerufen. Die im Cookie gespeicherte und in der Abfragezeichenfolge übergebene Sitzungs-ID wird verwendet, um den Eigentümer der Sitzung zu verfolgen. Daher können Sie sich bestimmte Variablen so vorstellen, dass sie einen Gültigkeitsbereich auf Sitzungsebene haben. Damit können Sie Objekte zwischen mehreren Anfragen speichern und Spuren von Benutzerzugriffen auf die Datenbank speichern. Achten Sie natürlich darauf, nicht unterschiedliche Versionen desselben Objekts zu speichern. Wenn Sie also ein Sitzungsobjekt in der Datenbank speichern, müssen Sie die Verwendung bestimmter Sperrstrategien in Betracht ziehen.

3. Anwendungsbereich

In anderen Sprachen, insbesondere JAVA, gibt es einen Cache-Pool, der das Konzept des „Anwendungsbereichs“ darstellt. Auf Variablen im Speicher können alle Objektinstanzen im Programm zugreifen. PHP verfügt nicht über eine solche Funktionalität, aber in großen Anwendungen ist es nützlich, auf Daten auf Anwendungsebene zuzugreifen, um auf Konfigurationsvariablen zuzugreifen.

Im Folgenden wird die Registrierung zum Implementieren dieser drei Bereiche verwendet. Das Klassendiagramm lautet wie folgt:

Registrierung der PHP-Architektur

<?php
namespace woo\base;
require_once( "woo/controller/AppController.php");
abstract class Registry {
    abstract protected function get( $key );
    abstract protected function set( $key, $val );
}
class RequestRegistry extends Registry {
    private $values = array();
    private static $instance;
    private function __construct() {}
    static function instance() {
        if ( ! isset(self::$instance) ) { self::$instance = new self(); }
        return self::$instance;
    }
    protected function get( $key ) {
        if ( isset( $this->values[$key] ) ) {
            return $this->values[$key];
        }
        return null;
    }
    protected function set( $key, $val ) {
        $this->values[$key] = $val;
    }
    static function getRequest() {
        return self::instance()->get(&#39;request&#39;);
    }
    static function setRequest( \woo\controller\Request $request ) {
        return self::instance()->set(&#39;request&#39;, $request );
    }
}
class SessionRegistry extends Registry {
    private static $instance;
    private function __construct() {
        session_start();
    }
    static function instance() {
        if ( ! isset(self::$instance) ) { self::$instance = new self(); }
        return self::$instance;
    }
    protected function get( $key ) {
        if ( isset( $_SESSION[__CLASS__][$key] ) ) {
            return $_SESSION[__CLASS__][$key];
        }
        return null;
    }
    protected function set( $key, $val ) {
        $_SESSION[__CLASS__][$key] = $val;
    }
    function setComplex( Complex $complex ) {
        self::instance()->set(&#39;complex&#39;, $complex);
    }
    function getComplex( ) {
        return self::instance()->get(&#39;complex&#39;);
    }
}
class ApplicationRegistry extends Registry {
    private static $instance;
    private $freezedir = "/tmp/data";
    private $values = array();
    private $mtimes = array();
    private function __construct() { }
    static function instance() {
        if ( ! isset(self::$instance) ) { self::$instance = new self(); }
        return self::$instance;
    }
    protected function get( $key ) {
        $path = $this->freezedir . DIRECTORY_SEPARATOR . $key;
        if ( file_exists( $path ) ) {
            clearstatcache();
            $mtime=filemtime( $path );
            if ( ! isset($this->mtimes[$key] ) ) { $this->mtimes[$key]=0; }
            if ( $mtime > $this->mtimes[$key] ) {
                $data = file_get_contents( $path );
                $this->mtimes[$key]=$mtime;
                return ($this->values[$key]=unserialize( $data ));
            }
        }
        if ( isset( $this->values[$key] ) ) {
            return $this->values[$key];
        }
        return null;
    }
    protected function set( $key, $val ) {
        $this->values[$key] = $val;
        $path = $this->freezedir . DIRECTORY_SEPARATOR . $key;
        file_put_contents( $path, serialize( $val ) );
        $this->mtimes[$key]=time();
    }
    static function getDSN() {
        return self::instance()->get(&#39;dsn&#39;);
    }
    static function setDSN( $dsn ) {
        return self::instance()->set(&#39;dsn&#39;, $dsn);
    }
    static function setControllerMap( \woo\controller\ControllerMap $map  ) {
        self::instance()->set( &#39;cmap&#39;, $map );
    }
    static function getControllerMap() {
        return self::instance()->get( &#39;cmap&#39; );
    }
    static function appController() {
        $obj = self::instance();
        if ( ! isset( $obj->appController ) ) {
            $cmap = $obj->getControllerMap();
            $obj->appController = new \woo\controller\AppController( $cmap );
        }
        return $obj->appController;
    }
}
//如果你安装了PHP的shm扩展,就可以使用该扩展中函数来实现应用程序注册表
class MemApplicationRegistry extends Registry {
    private static $instance;
    private $values=array();
    private $id;
    const DSN=1;
    private function __construct() {
        $this->id = @shm_attach(55, 10000, 0600);
        if ( ! $this->id ) {
            throw new Exception("could not access shared memory");
        }
    }
    static function instance() {
        if ( ! isset(self::$instance) ) { self::$instance = new self(); }
        return self::$instance;
    }
    protected function get( $key ) {
        return shm_get_var( $this->id, $key );
    }
    protected function set( $key, $val ) {
        return shm_put_var( $this->id, $key, $val );
    }
    static function getDSN() {
        return self::instance()->get(self::DSN);
    }
    static function setDSN( $dsn ) {
        return self::instance()->set(self::DSN, $dsn);
    }
}
?>


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn