これは Martin の「Enterprise Application Architecture Patterns」から学んだもので、PHP の動的言語の特性を補助し、Java よりもはるかに簡単に遅延読み込み (LazyLoad) を実装できます。基本原則は、仮想プロキシ (仮想プロキシ) をプレースホルダとして使用することです。プロキシ オブジェクトのメンバー (メソッドまたは属性) にアクセスすると、読み込みがトリガーされます。
ただし、私が実装したバージョンには制限があります:
オブジェクトにのみ適用可能で、配列などの基本的なデータ型をプロキシすることはできません (ArrayObject などの組み込みオブジェクトでカプセル化する必要があります)
プロキシされた後、一部のインターフェイスプロパティをオーバーロードする演算子を使用すると、ArrayAccess のインデクサーや Itreator のイテレーターなどの実装が無効になります。このプロキシを使用してコレクション型の遅延読み込みを処理する場合は、外部で反復できるように特別な処理用のサブクラスを継承する必要があります。 foreach を使用する
demo
コードをコピーします コードは次のとおりです:
// Test
$v = new VirtualProxy(function(){
echo 'Now, Loading', "n";
$ a = new ArrayObject(range(1,100));
$a->abc = 'a';
// 実際の使用では、DataMapper の findXXX メソッドが呼び出されます
// 返されるのはドメイン オブジェクトのコレクションです
return $a;
});
// プロキシ オブジェクトは元のオブジェクトとして直接アクセスします
// このとき、コンストラクターで渡されるコールバック関数が呼び出されます
// オブジェクトの読み込みの遅延を実現するため
echo $v->abc . $v->offsetGet(50); UVirtual プロキシ
コードをコピーします:
/** * 仮想プロキシ。メンバーにアクセスされた場合にのみクロージャ関数が呼び出され、ターゲット オブジェクトが生成されます。 *
* @著者tonyseek
*
*/
Class VirtualProxy {
private $ Holder = NULL;
Priving $loader;
/* *
* 仮想プロキシ。メンバーにアクセスされた場合にのみクロージャ関数が呼び出され、ターゲット オブジェクトが生成されます。
*
* @param Closure $loader プロキシ オブジェクトのクロージャ関数を生成します
*/
public function __construct(Closure $loader)
{
$this->loader = $loader;
/**
* プロキシ メンバー メソッドの呼び出し
*
* @param string $method
* @param array $arguments
* @throws BadMethodCallException
* @returnmixed
*/
public function __call($method, array $ argument = 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
* @returnmixed
*/
public function __get($プロパティ)
{
$this->check() ;
if (!isset($this->holder->$property)) {
新しい ErrorException() をスローします
}
return $this- >holder->$property;
/**
* プロキシメンバープロパティの割り当て
*
* @param string $property
* @parammixed $value
*/
パブリック関数 __set($property, $value)
{
$this->check(); ;holder->$property = $value;
}
/**
* プロキシ オブジェクトが既に存在するかどうかを確認し、存在しない場合は生成します。
*/
プライベート関数 check()
{
if (null == $this->holder) {
$loader = $ this->loader;
$this->holder = $loader();
}
}
http://www.bkjia.com/PHPjc/323536.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/323536.html
技術記事
これは Martin の「Enterprise Application Architecture Patterns」から学んだもので、PHP の動的言語の特性を補助し、Java よりもはるかに簡単に遅延読み込み (LazyLoad) を実装できます。基本的にオリジナル...