이 사람은 마틴의 "Enterprise Application Architecture Patterns"에서 배웠다고 합니다. PHP 동적 언어의 특성을 돕고 가상 프록시 자리 표시자를 통해 Java보다 훨씬 쉽게 지연 로딩을 구현할 수 있습니다. 유일한 결함은 내장된 기본 유형이 아닌 객체만 프록시할 수 있다는 것입니다.
제가 시도한 PHP 도메인 모델 디자인에서도 이것을 사용하여 DomainObject의 지연 로딩을 구현했습니다.
/**
* * 가상 프록시, 멤버에 접근할 때만 대상 객체를 생성하기 위해 클로저 함수가 호출됩니다.
*
* @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);