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 增加了对 .ZIP 文件的读取功能
Oct 09 PHP
简单的用PHP编写的导航条程序
Oct 09 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
Nov 01 PHP
php入门学习知识点一 PHP与MYSql连接与查询
Jul 14 PHP
php遍历所有文件及文件夹的方法深入解析
Jun 08 PHP
如何正确配置Nginx + PHP
Jul 15 PHP
smarty循环嵌套用法示例分析
Jul 19 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 PHP
php模拟post提交请求调用接口示例解析
Aug 07 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面向对象教程之自定义类
2014/06/10 PHP
Laravel5中contracts详解
2015/03/02 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
JQuery 常用方法基础教程
2009/02/06 Javascript
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
jquery multiSelect 多选下拉框
2010/07/09 Javascript
简单的Jquery全选功能
2013/11/07 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
jquery简单实现网页层的展开与收缩效果
2015/08/07 Javascript
Sublime Text 3常用插件及安装方法
2015/12/16 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
python将人民币转换大写的脚本代码
2013/02/10 Python
使用graphics.py实现2048小游戏
2015/03/10 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
django实现将后台model对象转换成json对象并传递给前端jquery
2020/03/16 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
机械专业毕业生推荐信范文
2013/11/25 职场文书
《称象》教学反思
2014/04/25 职场文书
爱国教育主题班会
2015/08/14 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL