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:
ist nur auf Objekte anwendbar und kann keine grundlegenden Datentypen wie Arrays vertreten (muss mit integrierten Objekten wie ArrayObject gekapselt werden)
wird als Proxy verwendet. Danach wurden einige Schnittstellenimplementierungen mit Operator-Überladungseigenschaften ungültig, z. B. der Indexer von ArrayAccess und der Iterator von Itreator. Wenn Sie diesen Proxy zum Verzögern des Ladens von Sammlungstypen verwenden, müssen Sie eine Unterklasse für spezielle Zwecke erben Verarbeitung so, dass Externe foreach-Iteration
demo
Code kopieren Der Code lautet wie folgt:
// Test
$v = new VirtualProxy(function(){
echo 'Now, Loading', "n";
$a = new ArrayObject(range(1,100));
$a->abc = 'a'
// Im tatsächlichen Gebrauch wird hier die findXXX-Methode aufgerufen
// Was zurückgegeben wird, ist eine Sammlung von Domänenobjekten
return $a;
});
// Auf das Proxy-Objekt wird direkt als Originalobjekt zugegriffen
// Zu diesem Zeitpunkt , die im Konstruktor übergebene Rückruffunktion heißt
// Um die Verzögerung des Ladens des Objektvorgangs zu erreichen
echo $v->offset(50); Virtueller Proxy
Code kopieren Der Code lautet wie folgt:
/**
* Virtueller Proxy, die Abschlussfunktion wird aufgerufen, um das Zielobjekt nur zu generieren, wenn auf das Mitglied zugegriffen wird.
*
* @author tonyseek
*
*/
class VirtualProxy
{
private $holder = null;
private $loader = null ;
/**
* Virtueller Proxy, die Abschlussfunktion wird aufgerufen, um das Zielobjekt nur zu generieren, wenn auf das Mitglied zugegriffen wird.
*
* @param Closure $loader generiert die Abschlussfunktion des Proxy-Objekts
* /
public function __construct(Closure $loader)
{
$this->loader = $loader;
/**
* Aufruf der Proxy-Mitgliedsmethode
*
* @param string $method
* @param array $arguments
* @throws BadMethodCallException
* @return gemischt
*/
öffentliche Funktion __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);
}
/**
* Lesen von Proxy-Mitgliedseigenschaften
*
* @param string $property
* @throws ErrorException
* @return gemischt
*/
public function __get($property)
{
$this- >check();
if ( !isset($this->holder->$property)) {
throw new ErrorException();
return $this->holder->$property;}
/**
* Zuweisung von Proxy-Mitgliedseigenschaften
*
* @param string $property
* @param gemischt $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();
}
}
}