Heim > Artikel > Backend-Entwicklung > So implementieren Sie Lazy Loading über einen virtuellen Proxy in PHP
Dieser Artikel stellt hauptsächlich vor, wie man das verzögerte Laden über einen virtuellen Proxy in PHP implementiert. Er hat einen gewissen Referenzwert, den ich jetzt mit Ihnen teilen kann.
Das Grundprinzip ist die Verwendung ein virtueller Proxy Der Proxy (Virtual Proxy) wird als Platzhalter verwendet. Sobald auf ein Mitglied (Methode oder Eigenschaft) des Proxy-Objekts zugegriffen wird, wird das Laden ausgelöst.
Dieses Ding wurde aus Martins „Enterprise Application Architecture Patterns“ gelernt. Es unterstützt die Eigenschaften der dynamischen PHP-Sprache und kann Lazy Loading (LazyLoad) viel einfacher implementieren als Java. Das Grundprinzip besteht darin, einen virtuellen Proxy (Virtual Proxy) als Platzhalter zu verwenden. Sobald auf ein Mitglied (Methode oder Attribut) des Proxy-Objekts zugegriffen wird, wird das Laden ausgelöst.
Die von mir implementierte Version weist jedoch Einschränkungen auf:
Sie ist nur auf Objekte anwendbar und kann keine grundlegenden Datentypen wie Arrays vertreten (sie muss mit integrierten Objekten wie ArrayObject gekapselt werden)
Nachdem Wenn Sie diesen Proxy verwenden, um das verzögerte Laden von Sammlungstypen zu verarbeiten, müssen Sie auch eine Unterklasse für die spezielle Verarbeitung erben Es kann extern mit foreach iteriert werden.
// 测试 $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(); } } }
Das Obige ist der gesamte Inhalt dieses Artikels Bitte achten Sie auf die chinesische PHP-Website!
Verwandte Empfehlungen:
Über die Analyse der URL-Kodierungsfunktion urlencode() in PHP
PHP
Analyse von 2 Sätzen von Konfigurationsdateien und Parametern von APC
Das obige ist der detaillierte Inhalt vonSo implementieren Sie Lazy Loading über einen virtuellen Proxy in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!