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 相关文章推荐
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 PHP
php仿ZOL分页类代码
Oct 02 PHP
PHP连接MongoDB示例代码
Sep 06 PHP
体育彩票排列三组选三算法分享
Mar 07 PHP
PHP程序员基本要求和必备技能
May 09 PHP
php清除和销毁session的方法分析
Mar 19 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
php实现的数字验证码及数字运算验证码
Jul 30 PHP
ThinkPHP3.2.1图片验证码实现方法
Aug 19 PHP
PHP实现的文件操作类及文件下载功能示例
Dec 24 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
Nov 30 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 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水印技术
2007/02/14 PHP
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
Discuz不使用插件实现简单的打赏功能
2019/03/21 PHP
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
Python实现八皇后问题示例代码
2018/12/09 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
Python字符串及文本模式方法详解
2020/09/10 Python
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
3个CCIE对一个工程师的面试题
2012/05/06 面试题
解决方案设计综合面试题
2015/08/31 面试题
生产部经理岗位职责
2013/12/16 职场文书
建筑系毕业生自我鉴定
2014/01/24 职场文书
企业委托书范本
2014/09/13 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
2014年干部培训工作总结
2014/12/17 职场文书
培训通知
2015/04/17 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
电话营销开场白
2015/05/29 职场文书
个人催款函范文
2015/06/24 职场文书
销售人员管理制度
2015/08/06 职场文书
员工担保书范本
2015/09/22 职场文书
全面盘点MySQL中的那些重要日志文件
2021/11/27 MySQL
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers