刚刚开始学Laravel就会接触到路由

Route::get('/', function () {return view('welcome');
});

后来笔者一本正经的去读过Route类的代码,惊讶的发现并没有get这个方法,之后了解到Laravel用了Facade模式。

Facade本质上是一个“把工作推给别人做的”的类。

Facade存在的价值,可以从服务容器谈起。服务容器,可见我的另一篇博文,地址:http://www.cnblogs.com/sweng/p/6430374.html

举个例子,不知道大家以前写代码有没有过obj->method(arg1,arg2)->func(arg3,arg4);的体验。学过服务容器的读者知道,这行代码就是把服务容器里的对象取出来,并调用他的方法。这对熟悉服务容器里注册过哪些类的开发人员来说,这种代码还是可以接受的。但是如果像路由定义那样,也要写成这样冗长的形式,实在太不优雅了。所以用Facade模式可以很好的精简代码长度。

我们先写一个DB类

namespace API;
class DB{public function __construct($args){}public function Write($str){echo 'Write:'.$str.PHP_EOL;}public function Read($str){echo 'Read:'.$str.PHP_EOL;}
}

数据库读写是整个系统非常常用的操作。但是DB类会注册在服务容器里,每次数据库读写都要把DB类的对象从服务容器里取出,实在很不方便。

我们写一个Facade类

class Facade{public function __construct(){//}public static function getInstance($classname,$args){return new $classname($args);}public static function getFacadeAccessor(){//}public static function __callstatic($method,$arg){$instance=static::getInstance(static::getFacadeAccessor(),[1,2,3]);return call_user_func_array(array($instance,$method),$arg);}
}

要理解这个类,我们只要关注最后一个函数,就是__callstatic魔术方法。这个方法就是Facade类型对象在调用他自身没有定义过的函数时,就会调用__callstatic方法,是一个“候选人”的角色。

我们再定义一个DBFacade类

class DBFacade extends Facade{public static function getFacadeAccessor(){return API\DB::class;}
}

每一个Facade子类都要实现getFacadeAccessor方法,返回只是一个类名字符串,用来代入getInstance方法,来创建一个真正“做事情”的类。

此时,Facade已经可以用了,我们调用DBFacade的静态方法

DBFacade::Write('hello');

阅读代码,我们发现,其实DBFacade是没有Write方法的,于是就调用他父类Facade的__callstatic魔术方法,魔术方法我们已经在父类里面实现了。

以前听过同行抱怨,PHP语法乱,难记。但实际上像魔术方法把Facade实现的非常简洁,可见语法设计的精妙。

转载于:https://www.cnblogs.com/sweng/p/6583005.html

解读Laravel,看PHP如何实现Facade?相关推荐

  1. php artisan code,源码解读 Laravel PHP artisan config:cache

    再来一篇源码解读系列,其实包含本篇 config:cache 源码解读在内,这三篇的源码解读都是跟线上环境部署 Laravel 项目有关,因为我们通常会使用这三个 artisan 命令来提高项目的执行 ...

  2. 论文解读 | 微信看一看实时Look-alike推荐算法

    作者丨gongyouliu 编辑丨lily 来源 | 授权转载自大数据与人工智能(ID:ai-big-data) 微信看一看的精选文章推荐(见下面图1)大家应该都用过,微信团队在今年发表了一篇文章来专 ...

  3. [论文解读]微信看一看实时Look-alike推荐算法

    论文链接:https://arxiv.org/abs/1906.05022 微信看一看的精选文章推荐(见下面图1)大家应该都用过,微信团队在今年发表了一篇文章来专门介绍精选推荐的算法实现细节(Real ...

  4. “史上最强春节档”来袭!数据解读值得看的影片是......

    戳蓝字"CSDN云计算"关注我们哦! 作者介绍:徐麟,目前就职于互联网公司数据部,哥大统计数据狗,从事数据挖掘&分析工作,喜欢用R&Python玩一些不一样的数据 ...

  5. GPT-4大模型硬核解读,看完成半个专家

    引言:本文将以2万字介绍GPT-4的核心技术要点.技术架构.训练流程.算力.局限与产业未来.作者陈巍博士为AI/存算一体专家,曾担任华为系自然语言处理企业的首席科学家.(深度技术科普与解读文章,不涉及 ...

  6. 关于人工智能的解读,看这一篇就够了

    人工智能的一个比较流行的定义,也是该领域较早的定义,是由当时麻省理工学院的约翰·麦卡锡在 1956 年的达特茅斯会议上提出的:人工智能就是要让机器的行为看起来就像是人所表现出的智能行为一样.但是这个定 ...

  7. ICCV2019最佳论文SinGAN全面解读,看这一篇就懂了

    轻沉 发自 浅度寺  量子位 出品 | 公众号 QbitAI 在韩国首尔举办的ICCV 2019会议上,SinGAN: Learning a Generative Model from a Singl ...

  8. 枚举类型enum用法_Java枚举深度解读,看这篇就够了

    作者 | 涛GuoGuo的跟屁虫丶博Ke 来源 | urlify.cn/aaamQf 66套java从入门到精通实战课程分享 Java枚举 1.枚举类概念的理解与定义 一个类的对象是有限个,确定的,我 ...

  9. HTTP协议是什么?详细解读HTTP看完还不懂你来找我

    文章将包含以下几方面内容: HTTP协议解读 与HTTP相关组件 与HTTP相关协议 HTTP组成 HTTP协议优缺点 HTTP协议解读 HTTP 是一种 超文本传输协议(Hypertext Tran ...

最新文章

  1. 一起做激光SLAM:常见SLAM技巧使用效果对比,后端
  2. 【ES6】数值的拓展
  3. JSP自定义标签之简单标签入门
  4. python爬取下拉列表数据_Python怎么爬取下拉式的网页?
  5. 办公室网络打印机的连接
  6. vue-element-admin台前端解决方案: 基于 vue 和 element-ui实现
  7. TVS 管性能及选型总结
  8. DLL导出函数名称改编的解决方法
  9. Oracle distinct后加as,【大话IT】为何加distinct之后就不走索引了
  10. 三大开源生信基础教程(bookdown编写,源码可作为模板)和视频课程
  11. 四、mysql数据常用命令
  12. seo该如何防止网站被挂***?!
  13. Dbgview 罕见的一次报错问题解决
  14. 抽数,数据抽取,增量数据的抽取方式
  15. Fatal error in launcher:解决
  16. 对象可以创建数组吗_企业微信活码如何创建?活码可以统计渠道来源吗?
  17. 浅谈provide与inject
  18. ReID行人重识别(训练+检测,附代码),可做图像检索,陌生人检索等项目
  19. 网络模拟器软件分享——Cisco Packet Tracer、华为eNSP、H3C Cloud Lab
  20. 冯巩的155句经典语,太有才了,这才是真正的幽默!

热门文章

  1. 华师大数据科学考研_21考研择校 | 华东师范大学软件工程怎么样?
  2. STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)+ 中断
  3. Qt工作笔记-把QTableWidget数据存为XML,启动时加载XML
  4. 根据Ping(ICMP协议)得到TTL并分析
  5. mysql优化之索引_mysql优化之索引
  6. hive in 字符串_hive常用函数 concat concat_ws row_number
  7. java环形链表_数据结构和算法(四)Java实现环形链表
  8. idea连接mysql怎么生成实体类_IDEA链接数据库自动生成实体类
  9. centos7 关闭防火墙的指令_CentOS7 怎么安装配置chrony时间同步服务?
  10. SSM项目使用example查询时多次查询条件相同