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 手机归属地查询 api
Feb 08 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
May 24 PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
Jun 03 PHP
php中字符串和正则表达式详解
Oct 23 PHP
php打印一个边长为N的实心和空心菱型的方法
Mar 02 PHP
php浏览历史记录的方法
Mar 10 PHP
PHP常用的三种设计模式汇总
Aug 28 PHP
php实现将base64格式图片保存在指定目录的方法
Oct 13 PHP
PHP设计模式之状态模式定义与用法详解
Apr 02 PHP
ThinkPHP 5.1 跨域配置方法
Oct 11 PHP
PHP copy函数使用案例代码解析
Sep 01 PHP
PHP7 其他语言层面的修改
Mar 09 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中文分词 自动获取关键词介绍
2012/11/13 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
javascript一些实用技巧小结
2011/03/18 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
JS原生轮播图的简单实现(推荐)
2017/07/22 Javascript
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
通过python3实现投票功能代码实例
2019/09/26 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
zooplus意大利:在线宠物商店
2019/08/07 全球购物
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
公司新人试用期自我评价
2014/09/17 职场文书
汽车机电维修工求职信
2014/09/30 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
Redis如何一键部署脚本
2021/04/12 Redis
logback如何自定义日志存储
2021/08/30 Java/Android