关 键 词:
代理 动态 实现 c-foo class echo property function
运行一下下面的代码
<?php
class Container {
public $foo;
function __construct() {
$this->foo=new Proxy($this);
}
}
class Proxy {
private $container;
function __construct(&$container) {
$this->container=$container;
}
function go() {
$this->container->foo=10;
}
}
$c=new Container;
echo "开始\n";
echo 'gettype($c->foo) = \''.gettype($c->foo)."'\n";
echo 'get_class($c->foo) = \''.get_class($c->foo)."'\n";
echo "然后\n";
$c->foo->go();
echo 'gettype($c->foo) = \''.gettype($c->foo)."'\n";
echo '$c->foo = '.$c->foo."\n";
?>
结果是:
开始
gettype($c->foo) = 'object'
get_class($c->foo) = 'Proxy'
然后
gettype($c->foo) = 'integer'
$c->foo = 10
可以看到,$c->foo已经从一个Proxy对象变成了一个整数,而这一切是在对象内部完成的。这样,我们就可以做一个清爽的动态代理了。
class Container {
var $p;
function __construct() {
$this->p=new Proxy($this,'p','Target');
}
}
class Target {
var $v=777;
}
class Proxy {
private $container;
private $property;
private $className;
function __construct(&$container, $property, $class) {
$this->container=&$container;
$this->property=$property;
$this->className=$class;
}
function __get($key) {
$class=$this->className;
$obj=new $class;
$property=$this->property;
$this->container->$property=$obj;
return $obj->$key;
}
function __call($func, $arg) {
$class=$this->className;
$obj=new $class;
$property=$this->property;
$this->container->$property=$obj;
return call_user_func_array(array($obj,$func), $arg);
}
}
$c=new Container;
echo get_class($c->p)."\n";
echo $c->p->v."\n";
echo get_class($c->p)."\n";
echo $c->p->v."\n";
可以看到,使用代理和使用实际对象没有区别,而且当第二次访问的时候,$c->p已经变成了实际的对象了。欢迎进入PHP开发资源论坛讨论。
相关文章
图文推荐
论 坛 资 源
·用一行php代码实现字符串的16进制编码解码
·php程序接口
·PHP单元测试
·关于php.ini的问题
·解决phpMyAdmin2.6以上版本数据乱码问题
·php截取中文字符串的函数
·PHP中的单引号和双引号的使用
·PHP数据库操作流程
·40个问题验证你是否是PHP菜鸟
·用php实现九九乘法表的几种方法
·php程序接口
·PHP单元测试
·关于php.ini的问题
·解决phpMyAdmin2.6以上版本数据乱码问题
·php截取中文字符串的函数
·PHP中的单引号和双引号的使用
·PHP数据库操作流程
·40个问题验证你是否是PHP菜鸟
·用php实现九九乘法表的几种方法
热门技术文档
·用一行php代码实现字符串的16进制编码解码
·php程序接口
·PHP单元测试
·关于php.ini的问题
·解决phpMyAdmin2.6以上版本数据乱码问题
·php截取中文字符串的函数
·[ZT] 如何判断一个Gif是否动画
·PHP中的单引号和双引号的使用
·PHP数据库操作流程
·40个问题验证你是否是PHP菜鸟
·php程序接口
·PHP单元测试
·关于php.ini的问题
·解决phpMyAdmin2.6以上版本数据乱码问题
·php截取中文字符串的函数
·[ZT] 如何判断一个Gif是否动画
·PHP中的单引号和双引号的使用
·PHP数据库操作流程
·40个问题验证你是否是PHP菜鸟
最新图文档
本站编辑推荐:(本站开通Delphi4PHP专区,欢迎进入论坛交流!)
- · 3分钟快速了解 Delphi for PHP 特色 (中文), PDF档
- · 购买Delphi for PHP的五大理由, PDF档
- · Delphi for PHP 使用规格介绍, PDF档
- · Delphi for PHP 問答集 (From CodeGear)
- · Delphi for PHP 产品价格表
编缉最近更新文章
- PHP剑道:PHP的魅力和
- 评论:在Web开发领域
- 专家预言:PHP将比Jav
- 初学者入门:细述PHP4
- Zend 产品价格
- Zend 增值服务
- 用一行php代码实现字
- php程序接口
- PHP单元测试
- php设计模式介绍之单
- php设计模式介绍之单
- php设计模式介绍之单
新闻资讯
ZEND产品
基础教程
高级应用
网站赞助商
搜索您感兴趣的内容




