Maison  >  Article  >  développement back-end  >  Comment implémenter le chargement paresseux via un proxy virtuel en php

Comment implémenter le chargement paresseux via un proxy virtuel en php

不言
不言original
2018-06-21 11:55:161614parcourir

Cet article présente principalement comment implémenter le chargement différé via un proxy virtuel en PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Le principe de base est d'utiliser. un proxy virtuel pour réaliser un chargement paresseux. Le proxy (Virtual Proxy) est utilisé comme espace réservé Une fois qu'un membre (méthode ou propriété) de l'objet proxy est accédé, le chargement est déclenché.

Cette chose a été apprise grâce aux "Modèles d'architecture d'application d'entreprise" de Martin. Elle améliore les caractéristiques du langage dynamique PHP et peut implémenter le chargement paresseux (LazyLoad) beaucoup plus facilement que Java. Le principe de base est d'utiliser un proxy virtuel (Virtual Proxy) comme espace réservé. Une fois l'accès à un membre (méthode ou attribut) de l'objet proxy, le chargement est déclenché.
Cependant, la version que j'ai implémentée a des limites :
Elle n'est applicable qu'aux objets et ne peut pas proxy des types de données de base tels que des tableaux (elle doit être encapsulée par des objets intégrés tels que ArrayObject)
Après avoir été proxy, certaines opérations implémentations d'interface avec des propriétés surchargées deviendront invalides, comme l'indexeur d'ArrayAccess et l'itérateur d'Itreator. Si vous utilisez ce proxy pour gérer le chargement retardé des types de collection, vous devez également hériter d'une sous-classe pour un traitement spécial afin que. il peut être itéré en externe en utilisant 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);

Proxy virtuel

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

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

À propos de l'analyse de la fonction d'encodage d'URL urlencode() en php

Comment utiliser PHP pour résoudre le problème du trafic de sites Web volumineux et des problèmes de concurrence élevée

PHP Analyse de 2 ensembles de fichiers de configuration et paramètres d'APC

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn