手机版

Laravel中简约却不简单的可宏的宏指令详解

时间:2021-08-31 来源:互联网 编辑:宝哥软件园 浏览:

百度百科的定义:

计算机科学里的宏(宏),是一种批量处理的称谓。一般说来,宏是一种规则或模式,或称语法替换,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。这种替换在预编译时进行,称作宏展开。

我一开始接触宏是在大学上计算机基础课程时,老师讲办公室时说的。那时老师介绍宏操作时没太在意,只记得这一操作很强大,它能使日常工作变得更容易。

今天我们讲讲Laravel中的宏操作

首先完整的源码

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)命名空间照亮\支持\特性;使用闭包;请使用ReflectionClass使用反射方法请使用BadMethodCalleExceptionRait Macroable {/* * *已注册的字符串宏* * @var数组*/受保护的静态$ macros=[];/** *注册自定义宏* * @ param字符串$ name * @ param对象|可调用$ macro * * @ return void */public static function macro($ name,$ macro){ static : $ macros[$ name]=$ macro;} /** *将另一个对象混合到类中* * @param对象$ mixin * @返回void */public静态函数mixin($ mixin){ $ methods=(new ReflectionClass($ mixin))-getMethods(reflectionmethod :3360 is _ PUBLIC | reflectionmethod 3360: is _ PROTECTED);foreach($ methods as $ method){ $ method-setAccessible(true);static : macro($ method-name,$ method-invoke($ mixin));} } /** *检查宏是否已注册* * @ param字符串$ name * @返回bool */public static函数has macro($ name){ return isset(static : $ macros[$ name]);} /** *动态处理对类的调用* * @ param string $方法* @ param array $参数* @返回混合* * @抛出\ BadMethodCalleException */public static function _ _ call static($ method,$parameters) { if(!静态:有宏($ Method)){ 0抛出新的baddmethocallexception(' Method { $ Method }不存在。');} if(静态: $ macros[$ method]的Closure实例){ return call _ user _ func _ array(Closure : bind(静态: $ macros[$ method],null,static:class),$ parameters);}返回call _ user _ func _ array(static : $ macros[$ method],$ parameters);} /** *动态处理对类的调用* * @ param string $方法* @ param array $参数* @返回混合* * @抛出\ BadMethodCalleException */public function _ _ call($ method,$parameters) { if(!静态:有宏($ Method)){ 0抛出新的baddmethocallexception(' Method { $ Method }不存在。');} $ macro=static : $ macros[$ method];if($ Closure的宏实例){ return call _ user _ func _ array($ macro-bindTo($ this,static:class),$ parameters);}返回call_user_func_array($macro,$ parameters);} } Macroable:macro方法

公共静态函数宏($name,$ macro){ static : $ macros[$ name]=$ macro;}很简单的代码,根据参数的注释,$宏可以传一个闭包或者对象,之所以可以传对象,多亏了服务器端编程语言(专业超文本预处理器的缩写)中的魔术方法

班级父亲{ //通过增加魔术方法** _ _调用* *我们就可以把对象当做闭包来使用了公共函数_ _ invoke(){ echo _ _ CLaSS _ _;} } class Child { use \ light \ Support \ Traits \ macro able;} //增加了宏指令之后,我们就能调用儿童对象中不存在的方法了子宏3360:(' show ',新父亲);//输出:父亲(新孩子)-显示();宏表:mixin方法

这个方法是把一个对象的方法的返回结果注入到原对象中

public static function mixin($ mixin){//通过反射$ methods=(新的反射类($ mixin))-Get methods(reflectionmethod :3360 is _ public | reflectionmethod 33603360 is _ protected)获取此对象中所有打开和受保护的方法;Foreach ($methods as $method) {//设置可访问的方法,因为受保护的无法从外部调用$ method-setAccessible(true);//调用宏方法批量创建宏指令static:宏($ method-name,$ method-invoke($ mixin));} }//实际使用类父{ public function say(){ return function(){ echo ' say ';};} public function show(){ return function(){ echo ' show ';};}受保护函数eat(){ return function(){ echo ' eat ';};} } class Child { use \ light \ Support \ Traits \ macro able;}//批量绑定宏指令Child:mixin(新爸爸);$ child=new Child//输出: say $ child-say();//输出: show $ child-show();//输出: eat $ child-eat();从上面的代码可以看出,mixin可以将一个类的方法绑定到一个宏类。请注意,该方法必须返回一个闭包类型。

*宏表:有宏方法

公共静态函数hasMacro($ name){ return isset(static : $ macros[$ name]);}这个方法比较简单,也没有什么复杂的说,只是判断是否有宏指令。通常,在使用宏命令之前,您应该进行判断。

* Macroable: _ _调用和macroable:3360 _ _调用静态方法

正是因为有了这两种方法,我们才能进行宏观操作。除了执行方法不同,这两种方法的代码是相似的。让我们在这里谈谈__call

Public function _ _ call ($ method,$ parameters){//如果此宏指令不存在,则抛出异常if(!static : has macro($ Method)){抛出新的baddmethocallexception(' Method { $ Method }不存在。');}//获取存储的宏指令$ macro=static :3360 $ macros[$ method];//对闭包做一点特殊处理if($ closure的宏实例){ return call _ user _ func _ array($ macro-bind to($ this,static :3360 class),$ parameters);}//不是闭包,比如使用一个对象时,直接用这个方法运行,但是需要保证对象有` __invoke `方法return call _ user _ func _ array($ macro,$ parameters);} class Child { use \ light \ Support \ Traits \ Macroable;受保护的$name='父亲';}//闭包的特殊处理需要绑定$this,比如child:3360宏(' show ',function(){ echo $ this-name;});//输出:父(新子)-show();在上面的操作中,当我们绑定宏时,我们可以在闭包中通过$this调用Child的属性,因为我们在__call方法中使用了Closure:bindTo方法。

官网对Closure:bindTo的解释:复制当前Closure对象,绑定指定的$this对象和类范围。

在Laravel中向类添加宏指令

Laravel中的许多类都将宏作为一种特性

例如,照明\文件系统\文件系统33603360类,我们想给这个类添加一个方法,但是它不会移动里面的代码。

1.我们只需要向app \ providers \ appserviceprovider :3360 register方法添加宏指令(您也可以创建一个新的服务提供者进行特殊处理)

2.然后添加一个测试路径来测试我们新添加的方法

3.然后打开浏览器运行,你会发现我们的代码可以正常运行并输出结果

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

版权声明:Laravel中简约却不简单的可宏的宏指令详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。