>백엔드 개발 >PHP 튜토리얼 >PHP_php에서 가상 프록시를 사용하여 지연 로딩 기술 구현 팁

PHP_php에서 가상 프록시를 사용하여 지연 로딩 기술 구현 팁

WBOY
WBOY원래의
2016-05-16 20:33:03939검색

이 사람은 마틴의 "Enterprise Application Architecture Patterns"에서 배웠다고 합니다. PHP 동적 언어의 특성을 돕고 가상 프록시 자리 표시자를 통해 Java보다 훨씬 쉽게 지연 로딩을 구현할 수 있습니다. 유일한 결함은 내장된 기본 유형이 아닌 객체만 프록시할 수 있다는 것입니다.

제가 시도한 PHP 도메인 모델 디자인에서도 이것을 사용하여 DomainObject의 지연 로딩을 구현했습니다.

코드 복사 코드는 다음과 같습니다.

* 가상 프록시, 멤버에 접근할 때만 대상 객체를 생성하는 클로저 함수가 호출됩니다.
*
* @author tonyseek
*
*/
클래스 가상프록시
{
개인 $holder = null;
개인 $loader = null;

/**
* * 가상 프록시, 멤버에 접근할 때만 대상 객체를 생성하기 위해 클로저 함수가 호출됩니다.
*
* @param Closure $loader는 프록시 객체의 클로저 기능을 생성합니다
​​*/
공개 함수 __construct(Closure $loader)
{
$this->loader = $loader;
}

/**
* * 대리회원 호출방법
*
* @param 문자열 $method
* @param 배열 $인수
* @BadMethodCallException을 발생시킵니다
* @return 혼합
​​*/
공용 함수 __call($method, 배열 $arguments = null)
{
                $this->check();

if (!method_exists($this->holder, $method)) {
                        새로운 BadMethodCallException()을 발생시킵니다.
            }

return call_user_func_array(
array(&$this->holder, $method),
                           $인수);
}

/**
* 대리회원 속성 읽기
*
* @param 문자열 $property
* @ErrorException 발생
* @return 혼합
​​*/
공개 함수 __get($property)
{
                $this->check();

if (!isset($this->holder->$property)) {
                           새로운 ErrorException()을 발생시킵니다.
            }

               return $this->holder->$property;
}

/**
* 대리회원 속성 부여
*
* @param 문자열 $property
* @param 혼합 $value
​​*/
공용 함수 __set($property, $value)
{
                $this->check();

$this->holder->$property = $value;
}

/**
* Proxy 객체가 이미 존재하는지 확인하고, 존재하지 않으면 생성합니다.
​​*/
비공개 기능 확인()
{
If (null == $this->holder) {
$loader = $this->loader;
$this->holder = $loader();
            }
}
}


// 테스트
$v = 새로운 VirtualProxy(함수(){
echo '지금 로드 중', "n";
$a = new ArrayObject(범위(1,100));
$a->abc = 'a';
//실제 사용시에는 DataMapper의 findXXX 메소드를 호출합니다
​​​​ //도메인 객체 컬렉션을 반환합니다
$a를 돌려주세요;
});
// 프록시 객체는 원본 객체로 직접 접근됩니다
// 이때 생성자가 전달한 콜백 함수를
이라고 합니다. //따라서 객체 작업 로딩 지연을 달성합니다
echo $v->abc .$v->offsetGet(50);

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.