ホームページ >バックエンド開発 >PHPチュートリアル >PHP アーキテクチャ レジストリ
レジストリモードとは何ですか?実はとても簡単なんです!
レジストリの役割は、システムレベルのオブジェクトアクセス機能を提供することです。私たちはコーディングする際に、「グローバル変数は良くない」という信念を抱くことがよくあります。ただし、すべてには 2 つの側面があり、グローバル データ アクセスは非常に魅力的です。
ここで問題が発生します:
ほとんどのシステムは複数のレイヤーに分割されており、各レイヤーは事前に定義されたチャネルを通じてのみ隣接するレイヤーと通信します。レイヤを共有するとプログラムが柔軟になり、各レイヤを置換または変更することでシステムの他の部分への影響を最小限に抑えることができます。しかし、あるレイヤーに隣接していない別のレイヤーの情報が必要な場合はどうでしょうか?
オプション 1: システムのレイヤー間の接続を通じて、あるオブジェクトから別の必要なオブジェクトにコンテキスト情報を渡します。この情報は、リクエストの処理を担当するコントローラーから、システム内の 1 つのオブジェクトから別のオブジェクトに渡されます。オブジェクトは渡されます。ビジネス ロジック層のオブジェクトに渡され、データベースとの通信を担当するオブジェクトに渡されます。もちろん、ApplicationHelper オブジェクトや特定の Context オブジェクトを渡すこともできます。
オプション 2: コンテキスト オブジェクトが必要なものであるかどうかを判断するために、すべてのオブジェクトのインターフェイスを変更する必要があります。明らかに、このアプローチでは疎結合が壊れる場合があります。
オプション 3: レジストリ モードを使用します。レジストリ クラスは、他のオブジェクトがその中のデータ (通常はオブジェクト) にアクセスできるようにする静的メソッド (またはシングルトン オブジェクトのインスタンス化メソッド) を提供します。システム全体のすべてのオブジェクトがこれらのデータ オブジェクトにアクセスできます。
PHP を実装する前にスコープを検討してください:
スコープは通常、コード内のオブジェクトまたは値の目に見えるプログラムを記述するために使用されます。変数のライフサイクルは時間内で測定できます。変数スコープには 3 つのレベルがあります。 。
1. HTTP リクエストのスコープ
は、HTTP リクエストの開始から終了までのサイクルを指します。
2. セッション スコープ
PHP にはセッション変数のサポートが組み込まれています。リクエストの終了時に、セッション変数がシリアル化されてファイル システムまたはデータベースに保存され、次のリクエストの開始時に取得されます。 Cookie に保存され、クエリ文字列で渡されるセッション ID は、セッションの所有者を追跡するために使用されます。したがって、特定の変数はセッション レベルのスコープを持つと考えることができます。これを使用すると、複数のリクエストの間にオブジェクトを保存し、データベースへのユーザー アクセスのトレースを保存できます。もちろん、同じオブジェクトの異なるバージョンを保持しないように注意してください。そのため、セッション オブジェクトをデータベースに保存するときは、特定のロック戦略の使用を考慮する必要があります。
3. アプリケーション スコープ
他の言語、特に JAVA には、「アプリケーション スコープ」という概念があるキャッシュ プールがあります。メモリ内の変数には、プログラム内のすべてのオブジェクト インスタンスからアクセスできます。 PHP にはそのような機能はありませんが、大規模なアプリケーションでは、構成変数にアクセスするためにアプリケーション レベルのデータにアクセスすると便利です。
以下では、レジストリを使用してこれら 3 つのスコープを実装します。クラス図は次のとおりです。
<?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('request'); } static function setRequest( \woo\controller\Request $request ) { return self::instance()->set('request', $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('complex', $complex); } function getComplex( ) { return self::instance()->get('complex'); } } 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('dsn'); } static function setDSN( $dsn ) { return self::instance()->set('dsn', $dsn); } static function setControllerMap( \woo\controller\ControllerMap $map ) { self::instance()->set( 'cmap', $map ); } static function getControllerMap() { return self::instance()->get( 'cmap' ); } 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); } } ?>