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 相关文章推荐
discuz论坛 用户登录 后台程序代码
Nov 27 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
Mar 02 PHP
JS中encodeURIComponent函数用php解码的代码
Mar 01 PHP
使用Apache的htaccess防止图片被盗链的解决方法
Apr 27 PHP
百度ping方法使用示例 自动ping百度
Jan 26 PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 PHP
PHP Session机制简介及用法
Aug 19 PHP
THINKPHP项目开发中的日志记录实例分析
Dec 01 PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 PHP
php设计模式之单例模式代码
Jun 11 PHP
PHP分享图片的生成方法
Apr 25 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 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使用header()输出图片缓存实例
2014/12/09 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
JavaScript判断窗口是否最小化的代码(跨浏览器)
2010/08/01 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
使用JavaScript和C#中获得referer
2014/11/14 Javascript
jQuery实现的图片分组切换焦点图插件
2015/01/06 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
Django的models模型的具体使用
2019/07/15 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
Python如何安装第三方模块
2020/05/28 Python
python 实现逻辑回归
2020/12/30 Python
一波HTML5 Canvas基础绘图实例代码集合
2016/02/28 HTML / CSS
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
武汉东之林科技有限公司机试
2013/09/17 面试题
介绍一下write命令
2012/09/24 面试题
JAVA软件工程师测试题
2014/07/25 面试题
骨干教师培训方案
2014/05/06 职场文书
趣味运动会广播稿
2014/09/13 职场文书
学校通报表扬范文
2015/05/04 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书