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(5) 类和对象
Feb 16 PHP
php date()日期时间函数详解
May 16 PHP
为PHP初学者的8点有效建议
Nov 20 PHP
PHP 第二节 数据类型之数值型
Apr 28 PHP
php判断字符串在另一个字符串位置的方法
Feb 27 PHP
ThinkPHP模板中数组循环实例
Oct 30 PHP
php使用for语句输出三角形的方法
Jun 09 PHP
php通过获取头信息判断图片类型的方法
Jun 26 PHP
php基本函数汇总
Jul 09 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
Mar 25 PHP
PHP命令空间namespace及use的用法小结
Nov 27 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实现生成模糊图片的方法示例
2017/12/21 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
prototype1.4中文手册
2006/09/22 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
js带缩略图的图片轮播效果代码分享
2015/09/14 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
python如何通过实例方法名字调用方法
2018/03/21 Python
Python实现的建造者模式示例
2018/08/06 Python
python绘制漏斗图步骤详解
2019/03/04 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
Python控制Firefox方法总结
2019/06/03 Python
Django REST framework 分页的实现代码
2019/06/19 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
Python Pandas数据分析工具用法实例
2020/11/05 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
电子邮箱格式怎么写
2014/01/12 职场文书
晚自修旷课检讨书怎么写
2014/11/17 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书