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 Memcache 中实现消息队列
Nov 24 PHP
php实现无限级分类实现代码(递归方法)
Jan 01 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
smarty模板引擎中自定义函数的方法
Jan 22 PHP
php获取当月最后一天函数分享
Feb 02 PHP
PHP中set_include_path()函数相关用法分析
Jul 18 PHP
redis查看连接数及php模拟并发创建redis连接的方法
Dec 15 PHP
php读取XML的常见方法实例总结
Apr 25 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
Oct 06 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
Aug 14 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 strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
2017/05/02 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
Vue侦测相关api的实现方法
2019/05/22 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
Python中生成Epoch的方法
2017/04/26 Python
Django网络框架之HelloDjango项目创建教程
2019/06/06 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
党性分析自查总结
2014/10/14 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
Spring Cache和EhCache实现缓存管理方式
2021/06/15 Java/Android
Python中Numpy和Matplotlib的基本使用指南
2021/11/02 Python
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android