首頁  >  文章  >  後端開發  >  php中透過虛擬代理實現延遲載入的實作程式碼

php中透過虛擬代理實現延遲載入的實作程式碼

高洛峰
高洛峰原創
2016-11-30 10:21:20887瀏覽

這貨是從 Martin 大神的《企業應用架構模式》中學到的,輔助 PHP 動態語言的特性,可以比 Java 輕鬆很多的實現延遲加載(LazyLoad)。基本原理是透過一個虛擬代理(Virtual Proxy)做佔位符,一旦存取代理物件的某成員(方法或屬性),載入就會被觸發。

不過我實現的這個版本有限制: 

只適用於對象,無法代理數組等基本資料類型(需要用ArrayObject 一類的內建對象封裝) 
被代理之後,一些帶有操作符重載性質的接口實作就失效了,例如ArrayAccess 的索引器、Itreator 的迭代器,如果是用該代理來處理集合類型的延遲加載,還需要繼承一個子類做特殊處理,以便外部用foreach 迭代 
demo 
複製代碼 代碼如下: 
// 測試 
$v = new VirtualProxy(function(){ 
echo 'Now, Loading', "n"; 
$a = new ArrayObject(range(1,100)); 
$a = new ArrayObject(range(1,100)); 
$a = new ArrayObject(range(1,100)); 
$a = 新 = '$ a'; 
// 實際使用中,這裡呼叫的是DataMapper 的findXXX 方法 
// 傳回的是領域物件集合 
return $a; 
}); 
// 代理物件直接當作原始物件存取 
}); 
// 代理物件直接當作原始物件存取 /而此時建構方法傳入的callback 函數才被呼叫 
// 從而實現載入物件操作的延遲 
echo $v->abc . $v->offsetGet(50); 

Virtual Proxy 
複製碼
/** 
* 虛代理,只有在被存取成員時才呼叫閉包函數產生目標物件。 

* @author tonyseek 

*/ 
class VirtualProxy 

private $holder = null; 
private $loader = null; 

/***/ 
. $this->loader = $loader; 


/** 
* 虛代理,只有在被存取成員時才呼叫閉包函數產生目標物件。 

* @param Closure $loader 產生被代理物件的閉包函數 
*/ 
public function __call($method, array $arguments = null) 

$this->check(); !method_exists($this->holder, $method)) { 
throw new BadMethodCallException(); 


return call_user_func_array( 
);
/** 
* 代理成員方法的呼叫 

* @param string $method 
* @param array $arguments 
* @throws BadMethodCallException 
* @return
* @throws BadMethodCallException 
* @return
* @throws BadMethodCallException 
* @return
* @throws BadMethodCallException 
* @return 做mixed */ 
public function __get($property) 

$this->check(); 

if (!isset($this->holder->$property)) { ErrorException(); 


return $this->holder->$property; 


/** 
* 代理成員屬性的讀取 

* @param string $property 
* @throws ErrorException 
* @return mixed 
*/ 
public function __set($property, $value. (); 

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


/** 
* 代理成員屬性的賦值 

* @param string $property 
* @param mixed $value 
*/ 
private function check() 

if (null == { 
$loader = $this->loader; 
$this->holder = $loader(); 



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn