仓酷云

标题: PHP编程:php中经由过程虚代办署理完成延迟加载的完成代码... [打印本页]

作者: 冷月葬花魂    时间: 2015-2-3 23:36
标题: PHP编程:php中经由过程虚代办署理完成延迟加载的完成代码...
你发奋努力,熟悉了安全方面的问题,然后又设计了一些程序,感觉还不错。   这货是从 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();
}
}
}
可以在书上很方便地做标记,及时记下自己的心得体会。
作者: 莫相离    时间: 2015-2-4 03:46
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者: 再现理想    时间: 2015-2-5 12:45
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
作者: 乐观    时间: 2015-2-6 20:46
本文当是我的笔记啦,遇到的问题随时填充
作者: 不帅    时间: 2015-2-18 09:00
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 蒙在股里    时间: 2015-2-27 05:39
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者: 只想知道    时间: 2015-3-6 05:20
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 简单生活    时间: 2015-3-11 10:58
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
作者: 飘飘悠悠    时间: 2015-3-12 03:00
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
作者: 爱飞    时间: 2015-3-13 00:09
当然这种网站的会员费就几十块钱。
作者: 深爱那片海    时间: 2015-3-17 00:10
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
作者: 仓酷云    时间: 2015-3-17 06:40
爱上php,他也会爱上你。
作者: 精灵巫婆    时间: 2015-3-23 23:56
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
作者: 金色的骷髅    时间: 2015-3-25 21:47
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 小女巫    时间: 2015-4-2 10:34
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
作者: 因胸联盟    时间: 2015-4-7 02:27
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者: 老尸    时间: 2015-4-9 14:12
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者: 透明    时间: 2015-4-11 15:24
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
作者: 柔情似水    时间: 2015-4-16 14:19
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者: 谁可相欹    时间: 2015-4-17 08:01
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2