国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

如何在yii2框架的di容器源碼中了解反射的作用

2020-03-22 19:06:24
字體:
供稿:網(wǎng)友
這篇文章主要介紹了關(guān)于如何在yii2框架的di容器源碼中了解反射的作用,有著一定的參考價(jià)值,現(xiàn)在分享給大家,有需要的朋友可以參考一下

反射簡介

參考官方簡介的話,PHP 5 具有完整的反射 API,添加了對(duì)類、接口、函數(shù)、方法和擴(kuò)展進(jìn)行反向工程的能力。 此外,反射 API 提供了方法來取出函數(shù)、類和方法中的文檔注釋

YII2框架中示例

對(duì)于yii2框架,應(yīng)該都知道di容器,對(duì)于di容器的源碼這里也主要講明Container類,先看看平時(shí)怎么使用di,就用yii2框架中注釋的示例代碼來展示;

container調(diào)用示例
namespace app/models;use yii/base/BaseObject;use yii/db/Connection;use yii/di/Container;interface UserFinderInterface function findUser();html' target='_blank'>class UserFinder extends BaseObject implements UserFinderInterface public $db; public function __construct(Connection $db, $config = []) $this- db = $db; parent::__construct($config); public function findUser() class UserLister extends BaseObject public $finder; public function __construct(UserFinderInterface $finder, $config = []) $this- finder = $finder; parent::__construct($config); $container = new Container; $container- set( yii/db/Connection , [ dsn = ... , $container- set( app/models/UserFinderInterface , [ class = app/models/UserFinder , $container- set( userLister , app/models/UserLister  $lister = $container- get( userLister  // 上述操作相當(dāng)于下列實(shí)現(xiàn) $db = new /yii/db/Connection([ dsn = ...  $finder = new UserFinder($db); $lister = new UserLister($finder);

上面的示例代碼只是實(shí)例化了Container類,然后調(diào)用set方法注入了其他對(duì)象,最后獲取到了依賴與其他對(duì)象創(chuàng)建的lister對(duì)象,既然只調(diào)用了set方法與get方法,那就先從調(diào)用最多的set開始看Container代碼。

set方法
public function set($class, $definition = [], array $params = []) $this- _definitions[$class] = $this- normalizeDefinition($class, $definition); $this- _params[$class] = $params; unset($this- _singletons[$class]); return $this;}

上面的代碼比較簡潔,調(diào)用了類的normalizeDefinition方法,這個(gè)一會(huì)再說,先說明在該方法中出現(xiàn)的三個(gè)屬性的含義

_definitions數(shù)組,保存依賴定義

_params數(shù)組,保存構(gòu)造函數(shù)的參數(shù)

_singletons,保存單例

再看normalizeDefinition方法,該方法主要作用是規(guī)范類定義

protected function normalizeDefinition($class, $definition) if (empty($definition)) { // 為空 return [ class = $class]; } elseif (is_string($definition)) { // 為字符串 return [ class = $definition]; } elseif (is_callable($definition, true) || is_object($definition)) { // 檢驗(yàn)是否為可調(diào)用函數(shù)或者對(duì)象 return $definition; } elseif (is_array($definition)) { // 檢測是否為數(shù)組 if (!isset($definition[ class ])) { if (strpos($class, // ) !== false) { $definition[ class ] = $class; } else { throw new InvalidConfigException( A class definition requires a class member.  return $definition; throw new InvalidConfigException( Unsupported definition type for / $class/ : . gettype($definition));}

上述代碼中已做了一些判斷注釋,不難發(fā)現(xiàn)最后需要返回的definition變量需要為數(shù)組格式,或者可調(diào)用函數(shù)與對(duì)象,注意回到剛開始的調(diào)用示例代碼,definition變量分別有數(shù)組格式不帶class鍵,
數(shù)組格式帶class鍵,與字符串類型。到底set方法調(diào)用已完畢,從源碼中分析基本上看不到反射的影子,也就是些傳入?yún)?shù)格式兼容處理再寫入類屬性,接著來看下示例代碼中的get方法吧。

get 方法
public function get($class, $params = [], $config = []) if (isset($this- _singletons[$class])) { // 直接返回單例 return $this- _singletons[$class]; } elseif (!isset($this- _definitions[$class])) { // 調(diào)用bulid return $this- build($class, $params, $config); $definition = $this- _definitions[$class]; if (is_callable($definition, true)) { // 可調(diào)用函數(shù)情況 $params = $this- resolveDependencies($this- mergeParams($class, $params)); $object = call_user_func($definition, $this, $params, $config); } elseif (is_array($definition)) { // 數(shù)組 $concrete = $definition[ class  unset($definition[ class  $config = array_merge($definition, $config); $params = $this- mergeParams($class, $params); if ($concrete === $class) { $object = $this- build($class, $params, $config); } else { $object = $this- get($concrete, $params, $config); } elseif (is_object($definition)) { // 對(duì)象直接保存到單例屬性集合中去 return $this- _singletons[$class] = $definition; } else { throw new InvalidConfigException( Unexpected object definition type: . gettype($definition)); if (array_key_exists($class, $this- _singletons)) { // singleton $this- _singletons[$class] = $object; return $object;}

上述代碼,簡要?jiǎng)澐忠幌拢?qǐng)稍作瀏覽,后面會(huì)繼續(xù)講述,先說明屬性_definitions集合中不存在的情況,即調(diào)用build,這個(gè)一會(huì)說明,再看如果存在相關(guān)class鍵的情況,下面會(huì)做幾種情況的處理,

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南平市| 桐乡市| 衡东县| 平昌县| 新乡县| 阳新县| 金乡县| 蒙山县| 铜鼓县| 阿图什市| 抚顺市| 和平县| 双桥区| 龙江县| 师宗县| 大荔县| 三穗县| 莱阳市| 连云港市| 凌源市| 贡觉县| 蒙山县| 商洛市| 涿州市| 铅山县| 马鞍山市| 镇巴县| 莱州市| 怀化市| 綦江县| 保靖县| 茶陵县| 吉木乃县| 金阳县| 南京市| 武平县| 盐城市| 宁安市| 巴里| 定边县| 霍邱县|