加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP中使用虚代理实现延迟加载技术

发布时间:2020-12-13 02:07:59 所属栏目:PHP教程 来源:网络整理
导读:《:PHP中使用虚代理实现延迟加载技术》要点: 本文介绍了:PHP中使用虚代理实现延迟加载技术,希望对您有用。如果有疑问,可以联系我们。 话说这货是从 Martin 大神的《企业应用架构模式》中学到的,辅助 PHP 动态语言的特性,可以比 Java 轻松很多的实现延迟

《:PHP中使用虚代理实现延迟加载技术》要点:
本文介绍了:PHP中使用虚代理实现延迟加载技术,希望对您有用。如果有疑问,可以联系我们。

话说这货是从 Martin 大神的《企业应用架构模式》中学到的,辅助 PHP 动态语言的特性,可以比 Java 轻松很多的实现延迟加载――通过一个虚代理占位符.唯一的缺陷,是只能代理对象,不能代理内置基本类型.PHP编程

我试水的 PHP 领域模型设计中,也是用这个来实现 DomainObject 的延迟加载.PHP编程

代码如下:

?* 虚代理,只有在被拜访成员时才调用闭包函数生成目标对象.
?*
?* @author tonyseek
?*
?*/
class VirtualProxy
{
??? private $holder = null;
??? private $loader = null;

??? /**
???? * 虚代理,只有在被拜访成员时才调用闭包函数生成目标对象.
???? *
???? * @param Closure $loader 生成被代理对象的闭包函数
???? */
??? public function __construct(Closure $loader)
??? {
??????????? $this->loader = $loader;
??? }PHP编程

??? /**
???? * 代理成员方法的调用
???? *
???? * @param string $method
???? * @param array? $arguments
???? * @throws BadMethodCallException
???? * @return mixed
???? */
??? public function __call($method,array $arguments = null)
??? {
??????????? $this->check();PHP编程

??????????? if (!method_exists($this->holder,$method)) {
??????????????????? throw new BadMethodCallException();
??????????? }PHP编程

??????????? return call_user_func_array(
??????????????????? array(&$this->holder,$method),
??????????????????? $arguments);
??? }PHP编程

??? /**
???? * 代理成员属性的读取
???? *
???? * @param string $property
???? * @throws ErrorException
???? * @return mixed
???? */
??? public function __get($property)
??? {
??????????? $this->check();PHP编程

??????????? if (!isset($this->holder->$property)) {
??????????????????? throw new ErrorException();
??????????? }PHP编程

??????????? return $this->holder->$property;
??? }PHP编程

??? /**
???? * 代理成员属性的赋值
???? *
???? * @param string $property
???? * @param mixed? $value
???? */
??? public function __set($property,$value)
??? {
??????????? $this->check();PHP编程

??????????? $this->holder->$property = $value;
??? }PHP编程

??? /**
???? * 检查是否已经存在被代理对象,不存在则生成.
???? */
??? private function check()
??? {
??????????? if (null == $this->holder) {
??????????????????? $loader = $this->loader;
??????????????????? $this->holder = $loader();
??????????? }
??? }
}PHP编程


// 测试
$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);
PHP编程

欢迎参与《:PHP中使用虚代理实现延迟加载技术》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读