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中常用编辑器推荐
Jan 02 PHP
PHP 输出简单动态WAP页面
Jun 09 PHP
不重新编译PHP为php增加openssl模块的方法
Jun 14 PHP
php下载文件的代码示例
Jun 29 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
解析thinkphp中的导入文件标签
Jun 20 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
Mar 19 PHP
使用php+swoole对client数据实时更新(一)
Jan 07 PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 PHP
php解析base64数据生成图片的方法
Dec 06 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 23 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
CI(CodeIgniter)框架介绍
2014/06/09 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
php常用字符函数实例小结
2016/12/29 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
javaScript复制功能调用实现方案
2012/12/13 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
Python实现求笛卡尔乘积的方法
2017/09/16 Python
python读写文件write和flush的实现方式
2020/02/21 Python
python能在浏览器能运行吗
2020/06/17 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
精彩的推荐信范文
2013/11/26 职场文书
高中地理教学反思
2014/01/29 职场文书
代理协议书范本
2014/04/22 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
作文批改评语
2014/12/25 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
市级三好生竞选稿
2015/11/21 职场文书