一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - php中通過虛代理實現延遲加載的實現代碼

php中通過虛代理實現延遲加載的實現代碼

2019-11-28 14:05php教程網 PHP教程

基本原理是通過一個虛代理(Virtual Proxy)做占位符,一旦訪問代理對象的某成員(方法或屬性),加載就被觸發。

這貨是從 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->abc = 'a'; 
// 實際使用中,這里調用的是 DataMapper 的 findXXX 方法 
// 返回的是領域對象集合 
return $a; 
}); 
// 代理對象直接當作原對象訪問 
// 而此時構造方法傳入的 callback 函數才被調用 
// 從而實現加載對象操作的延遲 
echo $v->abc . $v->offsetGet(50); 


Virtual Proxy 

復制代碼代碼如下:


/** 
* 虛代理,只有在被訪問成員時才調用閉包函數生成目標對象。 

* @author tonyseek 

*/ 
class VirtualProxy 

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

/** 
* 虛代理,只有在被訪問成員時才調用閉包函數生成目標對象。 

* @param Closure $loader 生成被代理對象的閉包函數 
*/ 
public function __construct(Closure $loader) 

$this->loader = $loader; 


/** 
* 代理成員方法的調用 

* @param string $method 
* @param array $arguments 
* @throws BadMethodCallException 
* @return mixed 
*/ 
public function __call($method, array $arguments = null) 

$this->check(); 

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


return call_user_func_array( 
array(&$this->holder, $method), 
$arguments); 


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

* @param string $property 
* @throws ErrorException 
* @return mixed 
*/ 
public function __get($property) 

$this->check(); 

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


return $this->holder->$property; 


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

* @param string $property 
* @param mixed $value 
*/ 
public function __set($property, $value) 

$this->check(); 

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


/** 
* 檢查是否已經存在被代理對象,不存在則生成。 
*/ 
private function check() 

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


延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品卡一卡2卡3卡4卡 | 王的视频视ivk| 高清国产精品久久久久 | 亚洲视频在线免费 | 99爱免费视频 | 四虎1515hhc0m | 亚洲 欧美 中文字幕 在线 | 国产一级在线观看视频 | 热门小说同人h改编h | 亚洲精品中文 | 久久99影院| 性夜影院爽黄A爽免费动漫 性色欲情网站IWWW九文堂 | 波多野结衣中文字幕乱七八糟 | 亚洲欧美成人综合在线 | 爱草视频| 日本高清不卡一区久久精品 | 久久精品男人影院 | 欧美日韩亚洲综合久久久 | 乌克兰17一18处交 | 欧美日韩国产一区二区三区欧 | 日本护士撒尿xxxxhd | 精品一区久久 | 成年私人影院免费视频网站 | av毛片免费看| 91麻豆国产精品91久久久 | 91亚洲视频在线观看 | 紧身裙女教师miad711在线 | 视频一区国产精戏刘婷 | 国产香蕉一区二区在线网站 | 99国产精品免费视频 | 深夜日韩 | 欧美大片一级片 | 天天草视频 | 国产有码在线 | 国产成人精品一区二区不卡 | 久久香蕉国产免费天天 | 农村妇女野外性生话免费视频 | 饭冈加奈子在线播放观看 | 四虎国产欧美成人影院 | 猫咪社区免费资源在线观看 | 国产高清免费在线 |