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();
}
}
}
可以在书上很方便地做标记,及时记下自己的心得体会。 如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域, 刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。 本文当是我的笔记啦,遇到的问题随时填充 Ps:以上纯属原创,如有雷同,纯属巧合 至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。 先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。 学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。 这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己 当然这种网站的会员费就几十块钱。 刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。 爱上php,他也会爱上你。 环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。 曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ; 遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。 写的比较杂,因为我也是个新手,不当至于大家多多指正。 其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎 最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。 其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。 首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
页:
[1]