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 相关文章推荐
在apache下限制每个虚拟主机的并发数!!!!
Oct 09 PHP
在windows iis5下安装php4.0+mysql之我见
Oct 09 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
Nov 02 PHP
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
Nov 10 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
一个比较不错的PHP日历类分享
Nov 18 PHP
php利用scws实现mysql全文搜索功能的方法
Dec 25 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
Feb 15 PHP
Ajax+PHP实现的分类列表框功能示例
Feb 11 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 has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
PHP中imagick函数的中文解释
2015/01/21 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
Python编程实现删除VC临时文件及Debug目录的方法
2017/03/22 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
给我一面国旗 python帮你实现
2019/09/30 Python
python3 求约数的实例
2019/12/05 Python
python默认参数调用方法解析
2020/02/09 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
基于keras中的回调函数用法说明
2020/06/17 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
Linux的主要特性
2016/09/03 面试题
教师党员公开承诺事项
2014/05/28 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
部门2014年度工作总结
2014/11/12 职场文书
北京英语导游词
2015/02/12 职场文书
Python中threading库实现线程锁与释放锁
2021/05/17 Python
Python实现生活常识解答机器人
2021/06/28 Python
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
Vue Element plus使用方法梳理
2022/12/24 Vue.js