成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Laravel中簡約卻不簡單的Macroable宏指令詳解

Laravel中簡約卻不簡單的Macroable宏指令詳解

熱門標(biāo)簽:高識別電銷機(jī)器人 合肥外呼系統(tǒng)app 拉薩打電話機(jī)器人 沈陽人工智能電銷機(jī)器人公司 哈爾濱400電話辦理到易號網(wǎng) 電銷機(jī)器人-快迭智能 寶安400電話辦理 h5 地圖標(biāo)注 智能外呼電銷系統(tǒng)

百度百科的定義:

計算機(jī)科學(xué)里的宏(Macro),是一種批量處理的稱謂。一般說來,宏是一種規(guī)則或模式,或稱語法替換 ,用于說明某一特定輸入(通常是字符串)如何根據(jù)預(yù)定義的規(guī)則轉(zhuǎn)換成對應(yīng)的輸出(通常也是字符串)。這種替換在預(yù)編譯時進(jìn)行,稱作宏展開。

我一開始接觸宏是在大學(xué)上計算機(jī)基礎(chǔ)課程時,老師講office時說的。那時老師介紹宏操作時沒太在意,只記得這一操作很強(qiáng)大,它能使日常工作變得更容易。

今天我們講講Laravel中的宏操作

首先完整的源碼

?php
 
namespace Illuminate\Support\Traits;
 
use Closure;
use ReflectionClass;
use ReflectionMethod;
use BadMethodCallException;
 
trait Macroable
{
 /**
 * The registered string macros.
 *
 * @var array
 */
 protected static $macros = [];
 
 /**
 * Register a custom macro.
 *
 * @param string $name
 * @param object|callable $macro
 *
 * @return void
 */
 public static function macro($name, $macro)
 {
 static::$macros[$name] = $macro;
 }
 
 /**
 * Mix another object into the class.
 *
 * @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));
 }
 }
 
 /**
 * Checks if macro is registered.
 *
 * @param string $name
 * @return bool
 */
 public static function hasMacro($name)
 {
 return isset(static::$macros[$name]);
 }
 
 /**
 * Dynamically handle calls to the class.
 *
 * @param string $method
 * @param array $parameters
 * @return mixed
 *
 * @throws \BadMethodCallException
 */
 public static function __callStatic($method, $parameters)
 {
 if (! static::hasMacro($method)) {
  throw new BadMethodCallException("Method {$method} does not exist.");
 }
 
 if (static::$macros[$method] instanceof Closure) {
  return call_user_func_array(Closure::bind(static::$macros[$method], null, static::class), $parameters);
 }
 
 return call_user_func_array(static::$macros[$method], $parameters);
 }
 
 /**
 * Dynamically handle calls to the class.
 *
 * @param string $method
 * @param array $parameters
 * @return mixed
 *
 * @throws \BadMethodCallException
 */
 public function __call($method, $parameters)
 {
 if (! static::hasMacro($method)) {
  throw new BadMethodCallException("Method {$method} does not exist.");
 }
 
 $macro = static::$macros[$method];
 
 if ($macro instanceof Closure) {
  return call_user_func_array($macro->bindTo($this, static::class), $parameters);
 }
 
 return call_user_func_array($macro, $parameters);
 }
}

Macroable::macro方法

public static function macro($name, $macro)
{
 static::$macros[$name] = $macro;
}

很簡單的代碼,根據(jù)參數(shù)的注釋,$macro可以傳一個閉包或者對象,之所以可以傳對象,多虧了PHP中的魔術(shù)方法

class Father
{
 // 通過增加魔術(shù)方法**__invoke**我們就可以把對象當(dāng)做閉包來使用了。
 public function __invoke()
 {
 echo __CLASS__;
 }
}
 
class Child
{
 use \Illuminate\Support\Traits\Macroable;
}
 
// 增加了宏指令之后,我們就能調(diào)用 Child 對象中不存在的方法了
Child::macro('show', new Father);
// 輸出:Father
(new Child)->show();

Macroable::mixin方法

這個方法是把一個對象的方法的返回結(jié)果注入到原對象中

public static function mixin($mixin)
{
 // 通過反射獲取該對象中所有公開和受保護(hù)的方法
 $methods = (new ReflectionClass($mixin))->getMethods(
  ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED
 );
 
 foreach ($methods as $method) {
  // 設(shè)置方法可訪問,因?yàn)槭鼙Wo(hù)的不能在外部調(diào)用
  $method->setAccessible(true);
 
  // 調(diào)用 macro 方法批量創(chuàng)建宏指令
  static::macro($method->name, $method->invoke($mixin));
 }
}
 
// 實(shí)際使用
class Father
{
 public function say()
 {
  return function () {
   echo 'say';
  };
 }
 
 public function show()
 {
  return function () {
   echo 'show';
  };
 }
 
 protected function eat()
 {
  return function () {
   echo 'eat';
  };
 }
}
 
class Child
{
 use \Illuminate\Support\Traits\Macroable;
}
 
// 批量綁定宏指令
Child::mixin(new Father);
 
$child = new Child;
// 輸出:say
$child->say();
// 輸出:show
$child->show();
// 輸出:eat
$child->eat();

在上面的代碼可以看出mixin可以將一個類的方法綁定到宏類中。需要注意的就是,方法必須是返回一個閉包類型。

* Macroable::hasMacro方法

public static function hasMacro($name)
{
 return isset(static::$macros[$name]);
}

這個方法就比較簡單沒什么復(fù)雜可言,就判斷是否存在宏指令。通常是使用宏指令之前判斷一下。

* Macroable::__call和Macroable::__callStatic方法

正是由于這兩個方法,我們才能進(jìn)行宏操作,兩個方法除了執(zhí)行方式不同,代碼大同小異。這里講一下__call

public function __call($method, $parameters)
{
 // 如果不存在這個宏指令,直接拋出異常
 if (! static::hasMacro($method)) {
  throw new BadMethodCallException("Method {$method} does not exist.");
 }
 
 // 得到存儲的宏指令
 $macro = static::$macros[$method];
 
 // 閉包做一點(diǎn)點(diǎn)特殊的處理
 if ($macro instanceof Closure) {
  return call_user_func_array($macro->bindTo($this, static::class), $parameters);
 }
 
 // 不是閉包,比如對象的時候,直接通過這種方法運(yùn)行,但是要確保對象有`__invoke`方法
 return call_user_func_array($macro, $parameters);
}
 
 
class Child
{
 use \Illuminate\Support\Traits\Macroable;
 
 protected $name = 'father';
}
 
// 閉包的特殊處理,需要做的就是綁定 $this, 如
Child::macro('show', function () {
 echo $this->name;
});
 
// 輸出:father
(new Child)->show();

在上面的操作中我們綁定宏時,在閉包中可以通過$this來調(diào)用Child的屬性,是因?yàn)樵赺_call方法中我們使用Closure::bindTo方法。

官網(wǎng)對Closure::bindTo的解釋:復(fù)制當(dāng)前閉包對象,綁定指定的$this對象和類作用域。

Laravel 中對類增加宏指令

Laravel中很多類都使用了宏這個trait

比如Illuminate\Filesystem\Filesystem::class,我們想為這個類增加一個方法,但不會動到里面的代碼。

1. 我們只需要到App\Providers\AppServiceProvider::register方法增加宏指令(你也可以專門新建一個服務(wù)提供者專門處理)


2. 然后增加一條測試路由,測試我們新增加的方法

3. 然后打開瀏覽器運(yùn)行,你就會發(fā)現(xiàn),我們的代碼可以正常的運(yùn)行了并輸出結(jié)果了

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

標(biāo)簽:張家口 梅州 成都 泰州 威海 林芝 巴中 山東

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Laravel中簡約卻不簡單的Macroable宏指令詳解》,本文關(guān)鍵詞  Laravel,中,簡約,卻,不簡單,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Laravel中簡約卻不簡單的Macroable宏指令詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Laravel中簡約卻不簡單的Macroable宏指令詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产精品视频区1| 国产精品久久久久久久久久免费| 九一国产在线观看| 久久久亚洲欧洲日产| 国产精品一区在线看| 青草青草久热精品视频在线网站| 中文字幕人成人乱码亚洲电影| 成人在线免费观看一区| 国产女人18毛片水真多18精品| 国产三级三级看三级| 在线免费av网| 99久久免费精品高清特色大片| 中文字幕一区日韩精品| 成人动漫视频在线| 色婷婷综合成人av| www视频在线观看免费| 亚洲av无码国产精品永久一区| 成年免费视频| 不卡在线视频| 乱熟女高潮一区二区在线| 成人在线免费观看| 欧美成人片在线观看| 日韩免费观看网站| 2019国产精品| 午夜影院韩国伦理在线| 国产无遮挡裸体免费视频| 色天堂在线视频| 欧美色道久久88综合亚洲精品| 欧美白人做受xxxx视频| 国产成人精品免高潮在线观看| 999国产精品视频免费| 美女大黄三级视频在线观看| 91制片厂在线| 欧美老女人性生活视频| 亚洲欧美日本一区| 亚洲网址在线观看| 国产suv精品一区二区三区| 国产高潮失禁喷水爽到抽搐| 少妇高清精品毛片在线视频| 日本久久免费| 国产视频福利| 亚洲人妖av一区二区| 国内自拍第二页| 国产性xxxx高清| 欧美中文字幕精品| 午夜午夜精品一区二区三区文| 国产91综合一区在线观看| 亚洲一二三区在线| 男人插女人下面免费视频| 1区2区在线观看| 无圣光视频在线观看| 国产中文欧美日韩在线| 久久久五月天| 久久午夜国产精品| 日本在线视频www| 麻豆av免费观看| 欧美美女在线| 国产精品电影一区二区三区| 日韩精品极品在线观看| 97视频热人人精品| 青青草国产精品亚洲专区无| 综合亚洲视频| 免费男女羞羞的视频网站中文字幕妖精视频| 色视频www在线播放国产| 欧美日韩在线视频免费观看| av免费在线观看网站| 天堂网站www天堂资源在线| jizzjizzjizzjizz日本| 色婷婷av一区二区三区久久| 精品不卡一区二区三区| 韩国一区二区av| 精品96久久久久久中文字幕无| 久久这里只有精品9| 国产精品欧美日韩| 欧美日韩精品免费看| 操碰在线免费| 青青操国产视频| 黄色一级片在线看| 日韩xxxx视频| 日韩免费一二三区| 四虎成人精品一区二区免费网站| 色小子综合网| 亚洲专区**| 粉嫩久久99精品久久久久久夜| 亚洲精品一品区二品区三品区| 一区二区冒白浆视频| 不卡在线观看av| 1024国产精品| 亚洲一区二区毛片| 原纱央莉成人av片| 日韩视频永久免费| 肉色丝袜一区二区| 男女性杂交内射妇女bbwxz| 国产伦精品一区二区三区视频| 97超碰人人模人人爽人人看| 日本视频在线观看一区二区三区| 四虎精品免费视频| 国产精品999久久久| 日本三级片在线观看| 日产欧产va高清| 成人在线免费观看网址| 国产99久久精品| 2020国产精品自拍| 亚洲成人男人天堂| 久久久久久久成人| 中文字幕先锋av影音资源网| 亚洲一区二区三区色| 在免费jizzjizz在线视频| 亚洲国模精品一区| 九九热在线免费视频| av一本在线| 亚洲成人生活片| 深夜影院在线观看| 亚洲精品免费观看| 日韩视频在线观看一区二区三区| 韩漫成人漫画| 五月天中文字幕一区二区| 天堂网在线观看视频| 亚洲一区二区三区视频在线播放| www污污在线| 日本亚洲欧美天堂免费| 亚洲国产精品成人无久久精品| 久久97人妻无码一区二区三区| 有色激情视频免费在线| 日韩欧美高清在线| 久久高清精品| 日韩电影免费观| 成年女人午夜毛片免费看| 国产成人久久久久| 久久免费在线观看| 国产二区视频在线播放| 在线欧美三级| 成人自拍视频| 青青草精品视频在线观看| 亚洲黄色高清| 中文日韩在线观看| 亚洲午夜久久久久久久| 香蕉国产在线视频| 色喇叭免费久久综合网| 久久www免费人成精品| 97成人在线观看视频| 色一情一乱一伦一区二区三欧美| 日本韩国福利视频| 天堂在线视频中文网| 欧美精品黑人猛交高潮| 麻豆一区二区三区四区精品蜜桃| 午夜电影网亚洲视频| 国产日韩换脸av一区在线观看| 97人人爽人人| 亚洲欧美偷拍视频| 国产午夜精品一区二区三区| 极品少妇xxxx精品少妇偷拍| 免费看一级毛片| 亚洲蜜桃精久久久久久久久久久久| 麻豆成人免费电影| 亚洲天堂日韩电影| 国产69精品久久久久久久| 色先锋av资源中文字幕| 99久久精品免费看国产一区二区三区| 一区二区国产日产| 免费91麻豆精品国产自产在线观看| 色婷婷综合久久久久中文| 国内精品久久久久久中文字幕| 青青草视频社区| 欧美小视频在线观看| 成人国产视频在线| 亚洲大肥女ass| 污网站在线观看| 岛国av一区二区| 久操视频在线免费观看| 色哦色哦哦色天天综合| 粉嫩久久99精品久久久久久夜| 性欧美videos另类喷潮| 久久超级碰碰| 亚洲激情一二三区| 日本免费色视频| 国产精品久久久久久久成人午夜| 一级片久久久久| 国产喷水福利在线视频| 粉嫩av亚洲一区二区图片| 久久精品国产亚洲777| **毛片在线网站| 国产一区影院| www.夜夜| 在线观看 中文字幕| 卡一卡二国产精品| 91中文在线| 日韩激情精品| 狠狠色综合久久婷婷| www.欧美.com| 成人高清免费在线播放| 中文字幕一区二区三区中文字幕| 日本视频在线观看一区二区三区| 最猛黑人系列在线播放| 女教师淫辱の教室蜜臀av软件| 区一区二日本| 四虎成人精品永久免费av九九| 人人做人人爽| 波多野结衣先锋影音| 精品人妻一区二区三区三区四区| 免费高清在线观看| 黄视频网站免费看| 人人干人人插| 欧美v国产在线一区二区三区| 国产精品视频免费| 久久亚洲精品人成综合网| 人偷久久久久久久偷女厕| 精品国产亚洲日本| 国产人妖一区| 一区二区三区精品99久久| 亚洲精品色午夜无码专区日韩| 羞羞免费视频网站| 逼特逼视频在线| 在线成人av电影| 一级全黄裸体免费视频| 在线免费精品视频| 国产盗摄一区二区三区在线| 日本不卡一区二区三区在线观看| 日韩视频在线观看| 亚洲春色一区二区三区| 国产精品高清一区二区三区| 一区二区三区不卡视频在线观看| 久久激情综合| 亚洲国产一区二区在线观看| 全部毛片永久免费看| 一级女性全黄久久生活片免费| 亚洲视频日本| 久久精品国产99国产精品澳门| 第九区2中文字幕| 91蜜桃传媒精品久久久一区二区| 色窝窝无码一区二区三区成人网站| 欧美一区二区三区久久| 国产精品美女视频| 成年人在线网站| 久久婷婷国产麻豆91天堂| 狠狠干成人综合网| 男女下面一进一出无遮挡| 精品国产欧美一区二区三区成人| 都市激情久久| 美女视频免费观看网站在线| 成人一级片在线观看| 成年人免费在线视频网站| 精品免费一区二区三区蜜桃| 国产寡妇亲子伦一区二区| 色综合手机在线| 九色蝌蚪在线视频| 无码人妻丰满熟妇啪啪欧美| 一区二区免费不卡在线| www.99久久热国产日韩欧美.com| 老鸭窝一区二区| 麻豆久久久9性大片| 亚洲а∨天堂久久精品喷水| 久久精品亚洲7777影院| 三级毛片电影网站| 波多野结衣视频在线观看| 亚洲精品在线一区二区| 激情图片中文字幕| 亚洲天堂导航| 久久国产日韩| 国产一区二区高清| 亚洲最大成人综合网| 国内精品一区二区三区四区| 高清在线一区二区| 亚洲精品在线网站| 来吧亚洲综合网| 免费的一级黄色片| 一区二区日韩电影| 成年女人a毛片免费视频| 一区二区在线观看视频在线观看| 男女啪啪免费观看| 草莓污污视频在线观看| 妖精视频成人观看www| 成人一区二区三区仙踪林| av中文资源在线资源免费观看| 99久久这里有精品| 日韩视频在线视频| 欧美精品激情| 免费麻豆国产一区二区三区四区| 中文字幕人妻互换av久久| 三级在线电影| 亚洲一二区在线观看| 国产美女做爰免费视频软件| 欧美日韩精品免费在线观看视频| 中文日韩在线| 黑鬼狂亚洲人videos| 3d性欧美动漫精品xxxx软件| 久久久亚洲精品视频| 天天综合日日夜夜精品| 黄色动漫网站入口| 欧美视频第一| 欧美 日韩 国产 一区二区三区| xxav视频| 日韩av一二三| 亚洲伦理电影| 青青草视频国产| 欧美性受xxxxxx黑人xyx性爽| 色悠悠久久综合| 色偷偷91综合久久噜噜| 99国产精品久久久久久久| 色综合色综合色综合色综合| 国产三级三级看三级| 天堂va在线高清一区| 玖玖玖国产精品| 国产一级成人av| 中文字幕有码热在线视频| 人妻91麻豆一区二区三区| 992tv成人免费观看| 亚洲美女视频在线观看| 亚洲性人人天天夜夜摸| **精品中文字幕一区二区三区| 极品在线视频| 国产在线观看福利| 天堂影视av| 国产不卡高清在线观看视频| 日韩精品视频在线观看网址| 一个人免费视频www在线观看| 韩国中文字幕hd久久精品| 大片免费在线看视频| 欧美日韩国产精品| 日韩视频一区二区三区在线播放免费观看| 中文字幕亚洲高清| av在线不卡观看| 亚洲成人黄色av| 日韩高清有码在线| 九色在线网站| 91精品国产高久久久久久五月天| 午夜欧美性电影| 精品国模一区二区三区欧美|