冷月葬花魂 发表于 2015-2-3 23:36:41

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:11

如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,

再现理想 发表于 2015-2-5 12:45:28

刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。

乐观 发表于 2015-2-6 20:46:40

本文当是我的笔记啦,遇到的问题随时填充

不帅 发表于 2015-2-18 09:00:30

Ps:以上纯属原创,如有雷同,纯属巧合

蒙在股里 发表于 2015-2-27 05:39:02

至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。

只想知道 发表于 2015-3-6 05:20:01

先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。

简单生活 发表于 2015-3-11 10:58:58

学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。

飘飘悠悠 发表于 2015-3-12 03:00:22

这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己

爱飞 发表于 2015-3-13 00:09:45

当然这种网站的会员费就几十块钱。

深爱那片海 发表于 2015-3-17 00:10:25

刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。

仓酷云 发表于 2015-3-17 06:40:10

爱上php,他也会爱上你。

精灵巫婆 发表于 2015-3-23 23:56:59

环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。

金色的骷髅 发表于 2015-3-25 21:47:47

曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ;

小女巫 发表于 2015-4-2 10:34:03

遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。

因胸联盟 发表于 2015-4-7 02:27:15

写的比较杂,因为我也是个新手,不当至于大家多多指正。

老尸 发表于 2015-4-9 14:12:00

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

透明 发表于 2015-4-11 15:24:19

最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。

柔情似水 发表于 2015-4-16 14:19:26

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。

谁可相欹 发表于 2015-4-17 08:01:11

首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
页: [1]
查看完整版本: PHP编程:php中经由过程虚代办署理完成延迟加载的完成代码...