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+mysql)
Nov 23 PHP
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
PHP Ajax中文乱码问题解决方法
Feb 27 PHP
PHP下判断网址是否有效的代码
Oct 08 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
Jun 03 PHP
php cli换行示例
Apr 22 PHP
PHP使用xmllint命令处理xml与html的方法
Dec 15 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
Apr 08 PHP
教大家制作简单的php日历
Nov 17 PHP
php 中奖概率算法实现代码
Jan 25 PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 PHP
phpStorm2020 注册码
Sep 17 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
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
javascript innerHTML使用分析
2010/12/03 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
2017/03/10 Javascript
微信小程序实现根据字母选择城市功能
2017/08/16 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
Python开发的实用计算器完整实例
2017/05/10 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
外贸业务员的岗位职责
2013/11/23 职场文书
小学生元旦广播稿
2014/02/21 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
疾病捐款倡议书
2014/05/13 职场文书
公司慰问信范文
2015/03/23 职场文书
初一年级组工作总结
2015/08/12 职场文书
56句经典英文座右铭
2019/08/09 职场文书