解读Laravel,看PHP如何实现Facade?
来源:互联网 发布:韩语输入法软件 编辑:程序博客网 时间:2024/05/16 18:20
刚刚开始学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实现的非常简洁,可见语法设计的精妙。
- 解读Laravel,看PHP如何实现Facade?
- 解读Laravel,看PHP如何实现Facade?
- Laravel - DB facade实现CURD
- Laravel Facade 实现原理揭秘
- Laravel框架学习(一) 如何添加Facade
- [李景山php]每天laravel[032]-laravel 基础知识 --- Contract 及 Facade
- 结合laravel Facade看外观模式怎么用?
- 看PHP 如何实现变色验证码
- 全面解读PHP的人气开发框架Laravel
- Laravel 门面类:Facade简记
- laravel CURD facade原始SQL
- Laravel 源码解读
- Laravel 源码解读
- 门面模式(Facade) laravel Facades
- laravel 的 loc,facade, Service Providers,Alias
- Laravel 架构中的 Container/ServiceProvider/Facade
- Laravel数据库操作之-DB facade
- laravel的模块化是如何实现的
- Django 小坑 系列 (持续更新中)
- ASP.NET Core MVC 源码学习:Routing 路由
- struts-dojo-tags datetimepicker标签无法正常显示问题 解决方案
- DWR安装配置
- DWRUtil未定义解决办法
- 解读Laravel,看PHP如何实现Facade?
- jQuery中remove()、empty()、detach()的区别
- struts2启动报错com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
- SSH整合java.lang.IllegalArgumentException: No bean specified
- Struts1标签的使用心得之如何用js获得Struts1标签的值
- C4top-是否完全二叉搜索树 (层次遍历+完全判断)
- 理解 RESTful WebService
- MySQL数字类型中的三种常用种类【转】
- Metadata Service 架构详解