これは 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 ;
});
// プロキシ オブジェクトはそのまま元のオブジェクトにアクセスされます
// このとき、コンストラクターによって渡されたコールバック関数が呼び出されます
// オブジェクトの読み込みの遅延を実現するため
echo $v->abc . $v->offsetGet(50);
コードは次のとおりです: /**
* 仮想プロキシ。メンバーにアクセスされた場合にのみクロージャー関数が呼び出され、ターゲット オブジェクトが生成されます。*
* @著者tonyseek
*
*/
class VirtualProxy
{
private $holder = null;
/**
* 仮想プロキシ。メンバーにアクセスされた場合にのみクロージャ関数が呼び出され、ターゲット オブジェクトが生成されます。
*
* @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 $arguments = null)
{
$this->check()
if (!method_exists($this->holder, $method) )) {
新しい BadMethodCallException();
}
return call_user_func_array(
array(&$this- >holder, $method),
$arguments);
/**
* プロキシ メンバー プロパティの読み取り
*
* @param string $property
* @throws ErrorException
* @returnmixed
*/
パブリック関数__get($property)
{
$this->check();
if (!isset( $this->holder->$property)) {
new 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- >ローダー;
$this->ホルダー = $loader();
上記は、0x0000008e コンピュータ ブルー スクリーン コードの内容を含む、仮想プロキシを介した遅延読み込みを実装するための PHP での 0x0000008e コンピュータ ブルー スクリーン コードの実装コードを紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。