老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

laravel服務容器的實現原理是什么

laravel 服務容器的實現原理是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

創新互聯-專業網站定制、快速模板網站建設、高性價比零陵網站開發、企業建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式零陵網站制作公司更省心,省錢,快速模板網站建設找我們,業務覆蓋零陵地區。費用合理售后完善,10多年實體公司更值得信賴。

什么是服務容器

服務容器是用來管理類依賴與運行依賴注入的工具。Laravel框架中就是使用服務容器來實現 ** 控制反轉 ** 和 ** 依賴注入 **。

什么是控制反轉(IoC)和依賴注入(DI)

控制反轉(IoC) 就是說把創建對象的** 控制權 進行轉移,以前創建對象的主動權和創建時機是由自己把控的,而現在這種權力轉移到第三方,也就是 Laravel ** 中的容器。

依賴注入(DI)則是幫助容器實現在運行中動態的為對象提供提依賴的資源。

概念容易不太容易讓人理解,舉個栗子:

//我們構建一個人的類和一個狗的類
 class People{    public $dog = null;    public function __construct()
    {
        $this->dog = new Dog();
    }    public function putDog(){        return $this->dog->dogCall();
    }

}class Dog{    public function dogCall(){        return '汪汪汪';
    }
}
 ``` 
這個人在遛狗,突然遇到了死對頭,他于是放狗咬人

$people = new People();
$people->putDog();
在這個操作中,people類要執行 putDog() 這個方法,需要依賴Dog類,一般我們像上面一樣,在people中利用構造函數來添加這個Dog依賴。如果使用控制反轉 依賴注入則是這個樣子
class People
{
public $dog = null;

public function __construct(Dog $Dog){
    $this->dog = $dog;
}public function putDog(){    return $this->dog->dogCall();
}

}

People類通過構造參數聲明自己需要的 依賴類,由容器自動注入。這樣就實現了程序的有效解耦,好處在這就不多說了。## Laravel容器依賴注入的實現###### 實現原理需要了解的知識點:> 閉包(匿名函數):匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數> 反射:PHP 5 以上版本具有完整的反射 API,添加了對類、接口、函數、方法和擴展進行反向工程的能力。 此外,反射 API 提供了方法來取出函數、類和方法中的文檔注釋###### 理解了閉包和反射的基本用法我們來看Laravel中是怎么實現容器的,下面代碼是我對laravel框架容器部分代碼的簡化核心版:

lass Container
{
/**
* 容器綁定,用來裝提供的實例或者 提供實例的回調函數
* @var array
*/
public $building = [];

/**
 * 注冊一個綁定到容器
 */public function bind($abstract, $concrete = null, $shared = false){    if(is_null($concrete)){
        $concrete = $abstract;
    }    if(!$concrete instanceOf Closure){
        $concrete = $this->getClosure($abstract, $concrete);
    }

    $this->building[$abstract] =  compact("concrete", "shared");
}//注冊一個共享的綁定 單例public function singleton($abstract, $concrete, $shared = true){
    $this->bind($abstract, $concrete, $shared);
}/**
 * 默認生成實例的回調閉包
 *
 * @param $abstract
 * @param $concrete
 * @return Closure
 */public function getClosure($abstract, $concrete){    return function($c) use($abstract, $concrete){
        $method = ($abstract == $concrete)? 'build' : 'make';        return $c->$method($concrete);
    };
}/**
 * 生成實例 
 */public function make($abstract){
    $concrete = $this->getConcrete($abstract);    if($this->isBuildable($concrete, $abstract)){
        $object = $this->build($concrete);
    }else{
        $object = $this->make($concrete);
    }    return $object;
}/**
 * 獲取綁定的回調函數
 */public function getConcrete($abstract){    if(! isset($this->building[$abstract])){        return $abstract;
    }    return $this->building[$abstract]['concrete'];
}/**
 * 判斷 是否 可以創建服務實體
 */public function isBuildable($concrete, $abstract){    return $concrete === $abstract || $concrete instanceof Closure;
}/**
 * 根據實例具體名稱實例具體對象
 */public function build($concrete){    if($concrete instanceof Closure){        return $concrete($this);
    }    //創建反射對象
    $reflector = new ReflectionClass($concrete);    if( ! $reflector->isInstantiable()){        //拋出異常
        throw new \Exception('無法實例化');
    }

    $constructor = $reflector->getConstructor();    if(is_null($constructor)){        return new $concrete;
    }

    $dependencies = $constructor->getParameters();
    $instance = $this->getDependencies($dependencies);    return $reflector->newInstanceArgs($instance);

}//通過反射解決參數依賴public function getDependencies(array $dependencies){
    $results = [];    foreach( $dependencies as $dependency ){
        $results[] = is_null($dependency->getClass())
            ?$this->resolvedNonClass($dependency)
            :$this->resolvedClass($dependency);
    }    return $results;
}//解決一個沒有類型提示依賴public function resolvedNonClass(ReflectionParameter $parameter){    if($parameter->isDefaultValueAvailable()){        return $parameter->getDefaultValue();
    }    throw new \Exception('出錯');

}//通過容器解決依賴public function resolvedClass(ReflectionParameter $parameter){    return $this->make($parameter->getClass()->name);

}

}
```

容器的工作流程

接著上面遛狗的例子:
//實例化容器類 $app = new Container(); //向容器中填充Dog $app->bind('Dog','App\Dog'); //填充People $app->bind('People', 'App\People'); //通過容器實現依賴注入,完成類的實例化; $people = $app->make('People'); //調用方法 echo $people->putDog();
上面示例中我們先實例化容器類,然后使用bind()方法 綁定接口和 生成相應的實例的閉包函數。然后使用make() 函數生成實例對象,在make()中會調用 isBuildable($concrete, $abstract) 來判斷 給定的服務實體($concrete參數)是否可以創建,可以創建 就會調用 build($concrete) 函數 ,build($concrete)函數會判斷傳的參數是 是** 閉包 還是 具體類名 **,如果是閉包則直接運行,如果是具體類名的話,則通過反射獲取該類的構造函數所需的依賴,完成實例化。

** 重點理解 下面這幾個函數中 反射的用法,應該就很好理解了 **
build($concrete) getDependencies(array $dependencies) resolvedNonClass(ReflectionParameter $parameter) resolvedClass(ReflectionParameter $parameter)

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創新互聯行業資訊頻道,感謝您對創新互聯的支持。


本文名稱:laravel服務容器的實現原理是什么
URL分享:http://www.xueling.net.cn/article/jcocoj.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 亚洲天堂av线 | 精品九九九| 日韩亚洲国产中文永久 | 亚洲aⅴ久久精品蜜桃 | 九九99靖品免费 | 内地级a艳片高清免费播放 99热在线播放 | 六月丁香婷婷色狠狠久久 | 久久丫精品国产免费 | 99热久RE这里只有精品小草 | 嫩草懂你的影院 | 亚洲精品成 | 全职猎人1999在线动漫免费观看 | 91成年网站 | 国内免费av | 欧美午夜寂寞影院 | 欧美乱XXXXX 柠檬av导航 | 少妇无码太爽了在线观看免费视频 | 欧美黄色看 | 国产亚洲精品久久久久丝瓜 | 热久久影视 | 午夜自产精品一区二区三区 | 久久免费看少妇高潮a片特黄网站 | 亚洲精品无码成人网站 | 国产毛毛片一区二区三区四区 | 国产欧洲精品视频 | 日本黄色毛片 | 欧美一及黄色片 | 人人爽人人澡人人人妻、百度 | 思思久久96热在精品国产 | 欧美美女性视频 | 欧美性在线观看 | 疯狂做受XXXX高潮视频免费 | 国精产品一区一区三区有限公司杨 | 成年人在线免费观看热视频 | 免费无码国产欧美久久18 | 亚洲成人h | 亚洲中文字幕精品久久久久久动漫 | 在线观看福利小视频 | 欧美日韩国产这里只有精品 | 九色91在线视频 | 无人在线视频观看免费 |