PHP __call()方法实现委托示例


Posted in PHP onMay 20, 2019

本文实例讲述了PHP __call()方法实现委托。分享给大家供大家参考,具体如下:

委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方替原先对象处理请求。这类似于继承,和在子类中调用父类的方法有点儿相似。

但在继承时,父类与子类的关系是固定的,而使用委托则可以在代码运行时改变使用的对象,这意味着委托比继承具有更大的灵活性。

1、创建一个类来将Person类的信息格式化并输出:

class PersonWriter{
 public function writeName(Persion $p){
  print $p->getName()."\n";
 }
 public function writeAge(Persion $p){
  print $p->getAge()."\n";
 }
}

2、下面的代码集合使用__call()方法和PersonWriter类对象来实现Person类:

class Person {
 private $writer;
 function __construct(PersonWriter $writer;){
  $this->writer = $writer;
 }
 function __call($methodname,$args){
  if(method_exists($this->writer,$methodname)){
   return $this->writer->$methodname($this);
  }
 }
 //...
}

代码中Person类接收一个PersonWriter对象作为构造方法的参数,并将它保持在属性变量writer。

__call()方法中,使用参数$methodname,检查PersonWriter对象中是否存在同名方法。如果相应方法存在,我们就委托PersonWriter对象来处理(调用相应方法),把当前类(Person类)的实例作为参数传递给PersonWriter对象(使用$this伪变量)。

因此,如果这样调用Person类:

$person = new Person(new PersonWriter());
$person->writeName();

__call()方法会被调用。然后会在PersonWriter对象中查找writeName()方法,并调用之。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP的FTP学习(三)
Oct 09 PHP
抓取并下载CSS中所有图片文件的php代码
Sep 26 PHP
php+iframe实现隐藏无刷新上传文件
Feb 10 PHP
php中的常用魔术方法总结
Aug 02 PHP
php生成txt文件标题及内容的方法
Jan 16 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
Apr 18 PHP
PHP资源管理框架Assetic简介
Jun 12 PHP
php简单实现sql防注入的方法
Apr 22 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
Jan 16 PHP
PHP实现动态添加XML中数据的方法
Mar 30 PHP
PHP面向对象程序设计继承用法简单示例
Dec 28 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 #PHP
PHP常量define和const的区别详解
May 18 #PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 #PHP
java解析json方法总结
May 16 #PHP
微信支付之JSAPI公众号支付详解
May 15 #PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 #PHP
yii2 开发api接口时优雅的处理全局异常的方法
May 14 #PHP
You might like
PHP脚本的10个技巧(7)
2006/10/09 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
php实现socket推送技术的示例
2017/12/20 PHP
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
js全选实现和判断是否有复选框选中的方法
2015/02/17 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
基于jQuery实现的查看全文功能【实用】
2016/12/11 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
python实现tail -f 功能
2020/01/17 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
俄罗斯护发和专业化妆品购物网站:Hihair
2019/09/28 全球购物
给客户的道歉信
2014/01/13 职场文书
大学军训感言200字
2014/02/26 职场文书
小学安全汇报材料
2014/08/14 职场文书
个人委托书怎么写
2014/09/17 职场文书
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
react中的DOM操作实现
2021/06/30 Javascript
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫