午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

PHP Laravel門(mén)面的實(shí)現(xiàn)原理詳解

瀏覽:384日期:2022-06-06 17:26:28
目錄
  • 環(huán)境
  • 原理

環(huán)境

Laravel 5.4

原理

在Laravel中,門(mén)面為應(yīng)用服務(wù)容器中綁定的類(lèi)提供了一個(gè)“靜態(tài)”接口,使得我們可以不用new這些類(lèi)出來(lái),就可以直接通過(guò)靜態(tài)接口調(diào)用這些類(lèi)中的方法。

下面我們先看看一個(gè)門(mén)面類(lèi)是怎么定義的:

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class Player extends Facade
{

    protected static function getFacadeAccessor() {
return "player";
    }

}

門(mén)面類(lèi)都繼承自Illuminate\Support\Facades\Facade父類(lèi),這個(gè)父類(lèi)中有一個(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)用。它通過(guò)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());
    }

這里通過(guò)我們自定義門(mén)面類(lèi)中的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];
    }

通過(guò)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ù)組的方式訪問(wèn)。

獲取到對(duì)象后,放入到static::$resolvedInstance靜態(tài)變量中,這樣下次再獲取相同對(duì)象時(shí),就不用重復(fù)實(shí)例化了。

到此這篇關(guān)于PHP Laravel門(mén)面的實(shí)現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)PHP Laravel門(mén)面內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標(biāo)簽: PHP
主站蜘蛛池模板: 欧美日韩在线免费观看视频 | 日韩网站在线观看 | 亚洲综合成人在线 | 看特级毛片 | 好吊色在线视频 | 黄色专区 | 午夜肉体高潮免费毛片 | 国产一级免费看 | 亚洲无吗av | 每日更新av | 狠狠se | 99热欧美| 在线免费看av网站 | 午夜综合网 | 特级黄色网| 伊人青草| 激情视频一区二区 | 看黄网站在线观看 | 三上悠亚在线观看视频 | 五月婷婷六月天 | 成人免费超碰 | av播放网站 | 国产一二三四 | 麻豆91在线观看 | 人成网站在线观看 | 超碰一级片 | 亚洲激情视频在线观看 | 成年人在线免费看 | 伊人网综合视频 | 自拍视频网站 | 精品中文视频 | 加勒比在线视频 | 久久久久久久久影视 | 欧美做受高潮1 | 欧美成人黑人xx视频免费观看 | 一色桃子av| 五月天久久婷婷 | 日少妇视频| 成人免费一区二区 | av在线免费观看不卡 | 嫩草天堂 |