|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你发奋努力,熟悉了安全方面的问题,然后又设计了一些程序,感觉还不错。 这货是从 Martin 大神的《企业使用架构形式》中学到的,帮助 PHP 静态言语的特征,可以比 Java 轻松良多的完成延迟加载(LazyLoad)。根基道理是经由过程一个虚代办署理(Virtual Proxy)做占位符,一旦会见代办署理对象的某成员(办法或属性),加载就被触发。
不外我完成的这个版本有局限性:
只合用于对象,没法代办署理数组等根基数据类型(需求用 ArrayObject 一类的内置对象封装)
被代办署理以后,一些带有操作符重载性质的接话柄现就生效了,例如 ArrayAccess 的索引器、Itreator 的迭代器,假如是用该代办署理来处置纠合类型的延迟加载,还需求承继一个子类做特别处置,以便内部用 foreach 迭代
demo
复制代码 代码以下:
// 测试
$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();
}
}
}
可以在书上很方便地做标记,及时记下自己的心得体会。 |
|