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 IP及IP段进行访问限制的代码
Dec 17 PHP
rephactor 优秀的PHP的重构工具
Jun 09 PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 PHP
PHP利用APC模块实现文件上传进度条的方法
Jan 26 PHP
PHP实现的增强性mhash函数
May 27 PHP
简单谈谈PHP中strlen 函数
Feb 27 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
php好代码风格的阶段性总结
Jun 25 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
关于php 高并发解决的一点思路
Apr 16 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
PHP抽象类基本用法示例
Dec 28 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/12/16 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
各种常用的JS函数整理
2013/10/25 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
微信小程序封装分享与分销功能过程解析
2019/08/13 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
Python实现的彩票机选器实例
2015/06/17 Python
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
python3 pygame实现接小球游戏
2019/05/14 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
领先的英国注册在线药房 :Simply Meds Online
2019/03/28 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
Watch Station官方网站:世界一流的手表和智能手表
2020/01/05 全球购物
营销主管自我评价怎么写
2013/09/19 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
2016年第29个世界无烟日宣传活动总结
2016/04/06 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP
Redis 限流器
2022/05/15 Redis
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers