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中使用unset销毁变量并内存释放问题
Jul 05 PHP
php笔记之:AOP的应用
Apr 24 PHP
Laravel 4 初级教程之Pages、表单验证
Oct 30 PHP
PHP获取服务器端信息的方法
Nov 28 PHP
经典PHP加密解密函数Authcode()修复版代码
Apr 05 PHP
php 利用socket发送HTTP请求(GET,POST)
Aug 24 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
Dec 31 PHP
PHP访问数据库集群的方法小结
Mar 14 PHP
php 如何获取文件的后缀名
Jun 05 PHP
php指定长度分割字符串str_split函数用法示例
Jan 30 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
Apr 16 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 函数中使用static的说明
2012/06/01 PHP
实例讲解php数据访问
2016/05/09 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
JS小框架 fly javascript framework
2009/11/26 Javascript
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
Express.JS使用详解
2014/07/17 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
python标准算法实现数组全排列的方法
2015/03/17 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
python django model联合主键的例子
2019/08/06 Python
python函数的作用域及关键字详解
2019/08/20 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
python 将Excel转Word的示例
2021/03/02 Python
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
申报职称专业技术个人的自我评价
2013/12/12 职场文书
个人担保书格式范文
2014/05/12 职场文书
农村党员一句话承诺
2014/05/30 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
晚会开场白和结束语
2015/05/29 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
python pygame 开发五子棋双人对弈
2022/05/02 Python