레지스트리 모드란 무엇인가요? 실제로는 매우 간단합니다!
레지스트리의 역할은 시스템 수준 개체 액세스 기능을 제공하는 것입니다. 우리는 코딩할 때 종종 "전역 변수는 나쁘다"는 신조로 받아들입니다. 그러나 모든 것에는 양면이 있으며 글로벌 데이터 액세스는 매우 매력적입니다.
여기서 문제가 발생합니다.
대부분의 시스템은 여러 레이어로 나누어져 있으며, 각 레이어는 사전 정의된 채널을 통해서만 인접한 레이어와 통신합니다. 레이어를 공유하면 프로그램이 유연해지며, 각 레이어를 교체하거나 수정하면 시스템의 다른 부분에 미치는 영향을 최소화할 수 있습니다. 하지만 다른 레이어와 인접하지 않은 한 레이어에 정보가 필요한 경우에는 어떻게 될까요?
옵션 1: 시스템 계층 간의 연결을 통해 한 객체에서 다른 필수 객체로 컨텍스트 정보를 전달합니다. 이 정보를 시스템의 한 객체에서 다른 객체로 전달합니다. 요청된 컨트롤러는 요청된 컨트롤러를 처리합니다. 개체는 비즈니스 논리 계층의 개체로 전달된 다음 데이터베이스와의 통신을 담당하는 개체로 전달됩니다. 물론 ApplicationHelper 개체나 특정 Context 개체를 전달할 수도 있습니다.
옵션 2: 컨텍스트 개체가 필요한지 여부를 확인하려면 모든 개체의 인터페이스를 수정해야 합니다. 분명히 때때로 이 접근 방식은 느슨한 결합을 깨뜨립니다.
옵션 3: 레지스트리 모드를 통해. 레지스트리 클래스는 다른 개체(일반적으로 개체)의 데이터에 액세스할 수 있도록 정적 메서드(또는 싱글톤 개체의 인스턴스화 메서드)를 제공합니다. 전체 시스템의 모든 개체는 이러한 데이터 개체에 액세스할 수 있습니다.
PHP를 구현하기 전에 범위를 고려하세요.
범위는 일반적으로 코드에서 개체나 값의 가시적인 프로그램을 설명하는 데 사용됩니다. 변수의 수명 주기는 시간에 따라 측정될 수 있습니다. 변수의 역할 영역에는 3가지 수준이 있습니다.
1. HTTP 요청 범위
는 HTTP 요청의 처음부터 끝까지의 주기를 나타냅니다.
2. 세션 범위
PHP에는 세션 변수에 대한 지원이 내장되어 있습니다. 요청이 끝나면 세션 변수가 직렬화되어 파일 시스템이나 데이터베이스에 저장된 후 다음 요청이 시작될 때 검색됩니다. 쿠키에 저장되고 쿼리 문자열로 전달된 세션 ID는 세션 소유자를 추적하는 데 사용됩니다. 따라서 특정 변수를 세션 수준 범위를 갖는 것으로 생각할 수 있습니다. 이를 사용하면 여러 요청 사이에 개체를 저장하고 데이터베이스에 대한 사용자 액세스 추적을 저장할 수 있습니다. 물론 동일한 개체의 다른 버전을 보유하지 않도록 주의하십시오. 따라서 세션 개체를 데이터베이스에 저장할 때 특정 잠금 전략 사용을 고려해야 합니다.
3. 애플리케이션 범위
다른 언어, 특히 JAVA에는 "애플리케이션 범위"라는 개념이 있는 캐시 풀이 있습니다. 메모리의 변수는 프로그램의 모든 개체 인스턴스에서 액세스할 수 있습니다. PHP에는 이러한 기능이 없지만 대규모 애플리케이션에서는 구성 변수에 액세스하기 위해 애플리케이션 수준 데이터에 액세스하는 것이 유용할 수 있습니다.
다음은 레지스트리를 사용하여 세 가지 범위를 구현합니다. 클래스 다이어그램은 다음과 같습니다.
<?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); } } ?>