本文主要是介绍laravel源码分析之 Macroable mixin,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前置知识:
Mixin(织入)模式并不是GOF的《设计模式》归纳中的一种,但是在各种语言以及框架都会发现该模式(或者思想)的一些应用。简单来说,Mixin是带有全部实现或者部分实现的接口,其主要作用是更好的代码复用。对比java interface和python protocol,这二者本身是没有任何实现的,都是需要使用者来实现相应的方法。
laravel场景:
Mixin本身也是一种能力的承诺,但Mixin不同的不同之处在于Mixin是有部分或者全部实现的,在Mixin中的实现有利于代码复用。如果是部分实现,那么就是在Mixin中实现整个流程,而实现Mixin约定的类提供关键的、该类特有的方法,这有点类似模板模式,也是依赖倒置原则的体现。mixin 事实上代表了某种能力(it can,xxxable),所以常在laravel源码中看到一些trait有xxxable的名称,基本是某类可实现的复用代码。
见代码laravel的Macroable源码分析
/*** 织入另一对象的方法到本类** @param object $mixin* @return void*/public static function mixin($mixin){$methods = (new ReflectionClass($mixin))->getMethods( // 获取传入对象公有或受保护方法数组ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED);foreach ($methods as $method) {$method->setAccessible(true); // 设置方法可访问static::macro($method->name, $method->invoke($mixin)); //执行反射方法,绑定宏指令}}
基本流程:
mixin实现,接受一个类或对象,获取其所有非私有方法组成的数组。遍历调用这些方法(这些方法返回闭包函数),将对象的方法(或注入类的静态方法)加入到其对应方法名为键, 闭包函数为值的macro数组中。这些宏指令方法,会在_call调用时绑定到当前使用类或对象上,然后通过call_user_func_array()调用闭包。
laravel应用简述
本质:将外部类或对象的方法(该方法返回闭包函数),应用到Macroable所在的类或对象上。
目的:达到对接口的实现。(即一处实现,处处使用)
附php相关反射方法及类说明
public ReflectionClass::__construct ( mixed $argument
) 初始化新的 ReflectionClass 对象。
-
既可以是包含类名的字符串(string)也可以是对象(object)。
argument
public array ReflectionClass::getMethods ([ int $filter
] ) 获取类的方法的一个数组
public mixed ReflectionMethod::invoke ( object $object
[, mixed $parameter
[, mixed $...
]] ) 执行一个反射的方法。
-
如果执行的方法是静态类,那么这个参数传送 null。
-
0,或者传送给方法的参数列表。可以通过这个参数,给方法传送大量的参数。
object
parameter
这篇关于laravel源码分析之 Macroable mixin的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!