国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

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

環(huán)境

Laravel 5.4

原理

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

下面我們先看看一個門面類是怎么定義的:

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class Player extends Facade
{

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

}

門面類都繼承自Illuminate\Support\Facades\Facade父類,這個父類中有一個魔術(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);
    }

當我們靜態(tài)調(diào)用一個不存在的方法時,例如Player::playOneSong(),這個魔術(shù)方法就會被調(diào)用。它通過getFacadeRoot()方法創(chuàng)建出一個對象,然后在這個對象上真正執(zhí)行我們的方法。

再看看getFacadeRoot()方法:

    /**
     * Get the root object behind the facade.
     *
     * @return mixed
     */
    public static function getFacadeRoot()
    {
return static::resolveFacadeInstance(static::getFacadeAccessor());
    }

這里通過我們自定義門面類中的getFacadeAccessor方法,獲取到一個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的對象,服務(wù)容器會幫我們實例化出對應(yīng)的對象(前提是已經(jīng)綁定好)。

服務(wù)容器$app是一個對象,但它實現(xiàn)了ArrayAccess接口,所以可以用這種數(shù)組的方式訪問。

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

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

標簽: PHP
主站蜘蛛池模板: 亚洲最新在线 | 成人毛片免费观看视频在线 | 末满18以下勿进色禁网站 | 欧美激情欧美狂野欧美精品免费 | 天干天干天啪啪夜爽爽色 | 欧美一级www| 国美女福利视频午夜精品 | 日韩精品视频免费在线观看 | 美国一级毛片完整高清 | 色www亚洲 | 韩国毛片视频 | 亚洲成a v人片在线看片 | 国产成人久久精品推最新 | 美女操穴视频 | 六月丁香婷婷天天在线 | 毛片爽爽爽免费看 | 九九久久久久午夜精选 | 亚洲天天看 | 99久久综合给久久精品 | 国产成人亚洲精品91专区高清 | 欧美日韩一二区 | 日韩免费一级a毛片在线播放一级 | 极品美女户外勾搭无套 | selaoban在线视频免费精品 | 丝袜一级片 | 精品国产三级a∨在线 | 久草在线视频免费看 | 日本www高清 | a级精品九九九大片免费看 a级毛片免费观看网站 | 久久久久久久国产a∨ | 香蕉久久一区二区不卡无毒影院 | 国产系列在线播放 | 国产精品1区2区3区在线播放 | 欧美孕交视频 | 精品丝袜国产自在线拍亚洲 | 欧美白人猛性xxxxx交69 | 欧美日韩亚洲一区二区三区 | 国产伦精品一区二区三区精品 | 日韩欧美一区二区中文字幕 | 中文字幕水野优香在线网在线 | 国产亚洲毛片在线 |