ホームページ  >  記事  >  バックエンド開発  >  PHPで仮想プロキシを介した遅延読み込みを実装する方法

PHPで仮想プロキシを介した遅延読み込みを実装する方法

不言
不言オリジナル
2018-06-21 11:55:161601ブラウズ

この記事では主に、PHP で仮想プロキシを介した遅延読み込みを実装する方法を紹介します。必要な友人に参考にしていただけるように共有します。仮想プロキシを使用して遅延読み込みを実現します。プロキシ (仮想プロキシ) は、プロキシ オブジェクトのメンバー (メソッドまたはプロパティ) にアクセスすると、読み込みがトリガーされます。

これは Martin の「Enterprise Application Architecture Patterns」から学んだもので、PHP 動的言語の特性を補助し、Java よりもはるかに簡単に遅延読み込み (LazyLoad) を実装できます。基本原則は、仮想プロキシ (仮想プロキシ) をプレースホルダとして使用することです。プロキシ オブジェクトのメンバー (メソッドまたは属性) にアクセスすると、読み込みがトリガーされます。

ただし、私が実装したバージョンには制限があります。

これはオブジェクトにのみ適用可能であり、配列などの基本的なデータ型をプロキシすることはできません (ArrayObject などの組み込みオブジェクトでカプセル化する必要があります)
その後プロキシ化、一部の操作 ArrayAccess のインデクサーや Itreator のイテレーターなど、シンボルのオーバーロードされた性質を持つインターフェイス実装が無効になります。 コレクション型の遅延読み込みを処理するためにプロキシを使用する場合は、サブクラスを継承する必要があります。外部の foreach 反復を使用できるようにするための特別な処理

// 测试 
$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);

仮想プロキシ

/** 
* 虚代理,只有在被访问成员时才调用闭包函数生成目标对象。 
* 
* @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(); 
} 
} 
}

以上がこの記事の全内容であり、皆様の学習に役立つことを願っています。その他の関連コンテンツについては、PHP 中国語 Web サイトに注目してください。

関連する推奨事項:

PHP の URL エンコード関数 urlencode() の分析について


PHP の使用方法大規模な Web サイトのトラフィックと同時実行の問題を解決するには


#PHP APC


の 2 セットの設定ファイルとパラメータの分析

以上がPHPで仮想プロキシを介した遅延読み込みを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。