《PHP應用:PHP中使用虛代理實現延遲加載技術》要點:
本文介紹了PHP應用:PHP中使用虛代理實現延遲加載技術,希望對您有用。如果有疑問,可以聯系我們。
話說這貨是從 Martin 大神的《企業應用架構模式》中學到的,輔助 PHP 動態語言的特性,可以比 Java 輕松很多的實現延遲加載――通過一個虛代理占位符.唯一的缺陷,是只能代理對象,不能代理內置基本類型.PHP編程
我試水的 PHP 領域模型設計中,也是用這個來實現 DomainObject 的延遲加載.PHP編程
??? /**
???? * 虛代理,只有在被拜訪成員時才調用閉包函數生成目標對象.
???? *
???? * @param Closure $loader 生成被代理對象的閉包函數
???? */
??? public function __construct(Closure $loader)
??? {
??????????? $this->loader = $loader;
??? }PHP編程
??? /**
???? * 代理成員方法的調用
???? *
???? * @param string $method
???? * @param array? $arguments
???? * @throws BadMethodCallException
???? * @return mixed
???? */
??? public function __call($method, array $arguments = null)
??? {
??????????? $this->check();PHP編程
??????????? if (!method_exists($this->holder, $method)) {
??????????????????? throw new BadMethodCallException();
??????????? }PHP編程
??????????? return call_user_func_array(
??????????????????? array(&$this->holder, $method),
??????????????????? $arguments);
??? }PHP編程
??? /**
???? * 代理成員屬性的讀取
???? *
???? * @param string $property
???? * @throws ErrorException
???? * @return mixed
???? */
??? public function __get($property)
??? {
??????????? $this->check();PHP編程
??????????? if (!isset($this->holder->$property)) {
??????????????????? throw new ErrorException();
??????????? }PHP編程
??????????? return $this->holder->$property;
??? }PHP編程
??? /**
???? * 代理成員屬性的賦值
???? *
???? * @param string $property
???? * @param mixed? $value
???? */
??? public function __set($property, $value)
??? {
??????????? $this->check();PHP編程
??????????? $this->holder->$property = $value;
??? }PHP編程
??? /**
???? * 檢查是否已經存在被代理對象,不存在則生成.
???? */
??? private function check()
??? {
??????????? if (null == $this->holder) {
??????????????????? $loader = $this->loader;
??????????????????? $this->holder = $loader();
??????????? }
??? }
}PHP編程
// 測試
$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);
PHP編程
歡迎參與《PHP應用:PHP中使用虛代理實現延遲加載技術》討論,分享您的想法,維易PHP學院為您提供專業教程。