PHP Laravel門面的實(shí)現(xiàn)原理詳解
環(huán)境
Laravel 5.4
原理
在Laravel中,門面為應(yīng)用服務(wù)容器中綁定的類提供了一個(gè)“靜態(tài)”接口,使得我們可以不用new這些類出來,就可以直接通過靜態(tài)接口調(diào)用這些類中的方法。
下面我們先看看一個(gè)門面類是怎么定義的:
<?php namespace App\Facades; use Illuminate\Support\Facades\Facade; class Player extends Facade { protected static function getFacadeAccessor() { return 'player'; } }
門面類都繼承自Illuminate\Support\Facades\Facade父類,這個(gè)父類中有一個(gè)魔術(shù)方法:
/** * Handle dynamic, static calls to the object. * * @param string $method * @param array $args * @return mixed * * @throws \RuntimeException */ public static function __callStatic($method, $args) { $instance = static::getFacadeRoot(); if (! $instance) { throw new RuntimeException('A facade root has not been set.'); } return $instance->$method(...$args); }
當(dāng)我們靜態(tài)調(diào)用一個(gè)不存在的方法時(shí),例如Player::playOneSong(),這個(gè)魔術(shù)方法就會(huì)被調(diào)用。它通過getFacadeRoot()方法創(chuàng)建出一個(gè)對(duì)象,然后在這個(gè)對(duì)象上真正執(zhí)行我們的方法。
再看看getFacadeRoot()方法:
/** * Get the root object behind the facade. * * @return mixed */ public static function getFacadeRoot() { return static::resolveFacadeInstance(static::getFacadeAccessor()); }
這里通過我們自定義門面類中的getFacadeAccessor方法,獲取到一個(gè)service_id(暫且這么叫吧),然后傳給resolveFacadeInstance方法。
再往下看resolveFacadeInstance方法:
/** * Resolve the facade root instance from the container. * * @param string|object $name * @return mixed */ protected static function resolveFacadeInstance($name) { if (is_object($name)) { return $name; } if (isset(static::$resolvedInstance[$name])) { return static::$resolvedInstance[$name]; } return static::$resolvedInstance[$name] = static::$app[$name]; }
通過static::$app[$name]從服務(wù)容器中獲取 key 為name的對(duì)象,服務(wù)容器會(huì)幫我們實(shí)例化出對(duì)應(yīng)的對(duì)象(前提是已經(jīng)綁定好)。
服務(wù)容器$app是一個(gè)對(duì)象,但它實(shí)現(xiàn)了ArrayAccess接口,所以可以用這種數(shù)組的方式訪問。
獲取到對(duì)象后,放入到static::$resolvedInstance靜態(tài)變量中,這樣下次再獲取相同對(duì)象時(shí),就不用重復(fù)實(shí)例化了。
到此這篇關(guān)于PHP Laravel門面的實(shí)現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)PHP Laravel門面內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js限制checkbox勾選的個(gè)數(shù)以及php獲取多個(gè)checkbbox的方法深入解析
以下是對(duì)js限制checkbox勾選的個(gè)數(shù)以及php獲取多個(gè)checkbbox的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07PHP中如何使用Redis接管文件存儲(chǔ)Session詳解
這篇文章主要給大家介紹了關(guān)于在PHP中如何使用Redis接管文件存儲(chǔ)Session的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11PHP圖像處理之imagecreate、imagedestroy函數(shù)介紹
這篇文章主要介紹了PHP圖像處理之imagecreate、imagedestroy函數(shù)介紹,imagecreate用于創(chuàng)建一個(gè)圖像,imagedestroy用于銷毀一個(gè)圖像,需要的朋友可以參考下2014-11-11php實(shí)現(xiàn)簡易聊天室應(yīng)用代碼
聊天應(yīng)用程序在網(wǎng)上非常常見,開發(fā)人員在構(gòu)建這類應(yīng)用程序時(shí)的選擇也很多。這篇文章介紹了如何實(shí)現(xiàn)基于PHP-AJAX的聊天應(yīng)用程序,并且不需要刷新頁面就可以發(fā)送和接收消息,需要的朋友可以參考下2015-09-09解決微信授權(quán)回調(diào)頁面域名只能設(shè)置一個(gè)的問題
在做項(xiàng)目集成微信登錄以及微信支付的時(shí)候,都需要進(jìn)行用戶授權(quán)。本文主要介紹了關(guān)于網(wǎng)頁授權(quán)回調(diào)域名的說明以及解決微信授權(quán)回調(diào)頁面域名只能設(shè)置一個(gè)問題的方案。需要的朋友可以參考借鑒2016-12-12