婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Laravel框架源碼解析之反射的使用詳解

Laravel框架源碼解析之反射的使用詳解

熱門標簽:辦理400電話哪家好點 邢臺400電話辦理 重慶外呼電銷系統多少錢 南京3D地圖標注 南寧電話外呼系統線路 嘟嘟云外呼系統 正規電銷機器人系統 濟源百應電銷機器人聯系方式 咸陽電銷

本文實例講述了Laravel框架源碼解析之反射的使用。分享給大家供大家參考,具體如下:

前言

PHP的反射類與實例化對象作用相反,實例化是調用封裝類中的方法、成員,而反射類則是拆封類中的所有方法、成員變量,并包括私有方法等。就如“解刨”一樣,我們可以調用任何關鍵字修飾的方法、成員。當然在正常業務中是建議不使用,比較反射類已經摒棄了封裝的概念。

本章講解反射類的使用及Laravel對反射的使用。

反射

反射類是PHP內部類,無需加載即可使用,你可以通過實例化 ReflectionClass 類去使用它。

方法

這里列舉下PHP反射類常用的方法

方法名 注釋
ReflectionClass::getConstant 獲取定義過的一個常量
ReflectionClass::getConstants 獲取一組常量
ReflectionClass::getConstructor 獲取類的構造函數
ReflectionClass::getDefaultProperties 獲取默認屬性
ReflectionClass::getDocComment 獲取文檔注釋
ReflectionClass::getEndLine 獲取最后一行的行數
ReflectionClass::getFileName 獲取定義類的文件名
ReflectionClass::getInterfaceNames 獲取接口(interface)名稱
ReflectionClass::getMethods 獲取方法的數組
ReflectionClass::getModifiers 獲取類的修飾符
ReflectionClass::getName 獲取類名
ReflectionClass::getNamespaceName 獲取命名空間的名稱
ReflectionClass::getParentClass 獲取父類

等等等等.... 所有關于類的方法、屬性及其繼承的父類、實現的接口都可以查詢到。
詳細文檔請參考官網: http://php.net/manual/zh/class.reflectionclass.php

栗子

?php
 namespace A\B;
 
 class Foo { }
 
 $function = new \ReflectionClass('stdClass');
 
 var_dump($function->inNamespace());
 var_dump($function->getName());
 var_dump($function->getNamespaceName());
 var_dump($function->getShortName());
 
 $function = new \ReflectionClass('A\\B\\Foo');
 
 var_dump($function->inNamespace());
 var_dump($function->getName());
 var_dump($function->getNamespaceName());
 var_dump($function->getShortName());
?>

輸出結果

bool(false)
string(8) "stdClass"
string(0) ""
string(8) "stdClass"

bool(true)
string(7) "A\B\Foo"
string(3) "A\B"
string(3) "Foo"

Laravel

Laravel在實現服務容器加載時使用了反射類。現在我們開啟“解刨”模式

入口文件

index.php

$app = require_once __DIR__.'/../bootstrap/app.php';

/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
 $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);

是引用語句發生的下一行調用了make方法。各位很清楚,make方法用于解析類,所有make方法的實現一定是在引用的文件內。

bootstrap\app.php

$app = new Illuminate\Foundation\Application(
 realpath(__DIR__.'/../')
);

laravel開始加載它的核心類,所有的實現從 Illuminate\Foundation\Application 開始。

Illuminate\Foundation\Application

public function make($abstract, array $parameters = [])
{
  $abstract = $this->getAlias($abstract);

  if (isset($this->deferredServices[$abstract])  ! isset($this->instances[$abstract])) {
   $this->loadDeferredProvider($abstract);
  }

  return parent::make($abstract, $parameters);
}

在核心類中你可能準確的查找到make方法的存在,它加載了服務提供者隨后調用了父類的方法make,要知道作為獨立的模塊 “服務容器”是絕對不能寫在核心類的。懂點設計模式的都很清楚。

Illuminate\Container\Container

$api = $this->app->make('HelpSpot\API',['id'=>1]); 為例來講解

// 真正的make方法,它直接調用了resolve繼續去實現make的功能
// $abstract = 'HelpSpot\API'
public function make($abstract, array $parameters = [])
{
 // $abstract = 'HelpSpot\API'
 return $this->resolve($abstract, $parameters);
}

...

protected function resolve($abstract, $parameters = [])
{
 ...
 // 判斷是否可以合理反射
 // $abstract = 'HelpSpot\API'
 if ($this->isBuildable($concrete, $abstract)) {
  // 實例化具體實例 (實際并不是實例化,而是通過反射“解刨”了)
  $object = $this->build($concrete);
 } else {
  $object = $this->make($concrete);
 }
 ...
}

public function build($concrete)
{
  // $concrete = 'HelpSpot\API'
  if ($concrete instanceof Closure) {
   return $concrete($this, $this->getLastParameterOverride());
  }
  // 實例化反射類
  $reflector = new ReflectionClass($concrete);

  // 檢查類是否可實例化
  if (! $reflector->isInstantiable()) {
   return $this->notInstantiable($concrete);
  }

  $this->buildStack[] = $concrete;

  // 獲取類的構造函數
  $constructor = $reflector->getConstructor();
  
  if (is_null($constructor)) {
   array_pop($this->buildStack);

   return new $concrete;
  }

  $dependencies = $constructor->getParameters();

  $instances = $this->resolveDependencies(
   $dependencies
  );

  array_pop($this->buildStack);
   
  // 從給出的參數創建一個新的類實例。
  return $reflector->newInstanceArgs($instances);
}

可見一個服務容器就加載成功了。

更多關于Laravel相關內容感興趣的讀者可查看本站專題:《Laravel框架入門與進階教程》、《php優秀開發框架總結》、《php面向對象程序設計入門教程》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家基于Laravel框架的PHP程序設計有所幫助。

您可能感興趣的文章:
  • Laravel框架源碼解析之模型Model原理與用法解析
  • Laravel框架源碼解析之入口文件原理分析
  • Laravel 框架控制器 Controller原理與用法實例分析
  • Laravel框架數據庫CURD操作、連貫操作總結
  • PHP開發框架Laravel數據庫操作方法總結
  • Laravel框架中擴展函數、擴展自定義類的方法
  • Laravel框架路由配置總結、設置技巧大全
  • Laravel 5 框架入門(一)
  • Laravel 5框架學習之數據庫遷移(Migrations)
  • Laravel 5框架學習之向視圖傳送數據
  • Laravel 5框架學習之用戶認證
  • Laravel框架集合用法實例淺析

標簽:平頂山 黃山 隴南 河南 唐山 武漢 通遼 南通

巨人網絡通訊聲明:本文標題《Laravel框架源碼解析之反射的使用詳解》,本文關鍵詞  Laravel,框架,源碼,解析,之,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Laravel框架源碼解析之反射的使用詳解》相關的同類信息!
  • 本頁收集關于Laravel框架源碼解析之反射的使用詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    色婷婷综合久久久中文字幕| 亚洲欧洲av一区二区三区久久| 国产一区亚洲一区| 亚洲综合色丁香婷婷六月图片| 欧美成人女星排名| 欧美日韩在线免费视频| 丁香桃色午夜亚洲一区二区三区| 日韩精品五月天| 一区二区三区四区乱视频| 国产婷婷色一区二区三区四区 | 久久综合九色综合97婷婷女人| 在线观看不卡视频| 成人av午夜电影| 国产成人亚洲综合a∨婷婷| 蜜桃在线一区二区三区| 日韩国产欧美在线观看| 婷婷综合五月天| 亚洲午夜av在线| 亚洲一区视频在线| 亚洲在线成人精品| 亚洲一区二区影院| 亚洲曰韩产成在线| 亚洲成av人片| 日日摸夜夜添夜夜添精品视频| 亚洲一区二区在线免费观看视频| 一区二区三区自拍| 一区二区三国产精华液| 国产女人18水真多18精品一级做 | 轻轻草成人在线| 天堂一区二区在线免费观看| 午夜电影网亚洲视频| 日日摸夜夜添夜夜添国产精品| 免费久久99精品国产| 九九热在线视频观看这里只有精品| 毛片av一区二区| 国内成人免费视频| 国产一区二区三区综合| 精品一区二区三区香蕉蜜桃 | gogogo免费视频观看亚洲一| 99久久精品免费看国产免费软件| 日本乱码高清不卡字幕| 欧美无砖砖区免费| 欧美成va人片在线观看| 欧美国产精品v| 亚洲国产日韩a在线播放| 美女视频第一区二区三区免费观看网站| 天堂久久久久va久久久久| 国精产品一区一区三区mba视频| 亚洲成人你懂的| 老汉av免费一区二区三区| 秋霞午夜av一区二区三区| 成人精品高清在线| 欧美视频中文一区二区三区在线观看| 91精品欧美福利在线观看| 亚洲精品一区二区三区福利| 国产精品久久久久久久久久久免费看| 亚洲激情男女视频| 精品一区二区免费| 色哟哟亚洲精品| 欧美大片拔萝卜| 中文字幕日韩精品一区| 日本强好片久久久久久aaa| 国产成人免费网站| 欧美日韩二区三区| 国产视频一区在线播放| 视频精品一区二区| 99久久精品免费| 欧美sm极限捆绑bd| 亚洲一区在线电影| 成人av一区二区三区| 欧美性猛片aaaaaaa做受| 国产色产综合产在线视频| 偷拍亚洲欧洲综合| 一道本成人在线| 久久久青草青青国产亚洲免观| 亚洲成人免费观看| 91亚洲资源网| 久久久另类综合| 美女看a上一区| 欧美日本一区二区三区| 中文字幕制服丝袜一区二区三区 | 亚洲激情在线播放| 黄色资源网久久资源365| 欧美久久一二三四区| 中文字幕在线不卡视频| 国产99久久精品| 精品国产第一区二区三区观看体验| 亚洲国产另类av| 色综合久久久久网| 亚洲欧洲一区二区在线播放| 成人免费视频国产在线观看| 精品999久久久| 韩国av一区二区| 日韩美女天天操| 精品一区二区三区免费| 日韩欧美高清dvd碟片| 日产欧产美韩系列久久99| 欧美色倩网站大全免费| 亚洲五月六月丁香激情| 欧美日韩国产精品成人| 亚洲大片在线观看| 欧美精三区欧美精三区| 亚洲18色成人| 91精品国产综合久久香蕉麻豆| 国产精品欧美久久久久无广告| 日韩成人伦理电影在线观看| 欧美一区在线视频| 美女mm1313爽爽久久久蜜臀| www激情久久| 粉嫩aⅴ一区二区三区四区| 国产精品视频你懂的| 91成人免费在线视频| 中文字幕精品一区二区精品绿巨人 | 亚洲成a天堂v人片| 91精品国产综合久久久久| 精品无码三级在线观看视频| 午夜视频一区二区三区| 欧美日韩国产三级| 免费欧美高清视频| 制服.丝袜.亚洲.另类.中文| 久久机这里只有精品| 26uuu国产电影一区二区| 99久久综合精品| 国产网红主播福利一区二区| 97精品超碰一区二区三区| 亚洲激情综合网| 日韩免费电影网站| 风间由美一区二区三区在线观看| 亚洲欧美欧美一区二区三区| 欧美日韩国产高清一区二区| 国产在线一区二区| 亚洲男帅同性gay1069| 欧美久久久久免费| 国产一区二区在线电影| ●精品国产综合乱码久久久久| 欧美日韩一区二区三区高清| 国产在线精品一区二区夜色| 久久久亚洲精品一区二区三区 | 欧美日韩你懂得| 狠狠色综合日日| 一区二区在线免费| 日本不卡在线视频| 337p日本欧洲亚洲大胆精品| 色综合天天性综合| 日韩在线一区二区三区| 久久精品免费在线观看| 欧美日韩久久久| 成人亚洲精品久久久久软件| 日韩福利视频网| 亚洲欧美偷拍三级| 欧美精品一区二区久久婷婷| 欧美视频你懂的| 成人黄色在线看| 一区二区三区免费观看| 欧美日本精品一区二区三区| 免费黄网站欧美| 夜夜精品视频一区二区| 久久久噜噜噜久噜久久综合| 99精品久久只有精品| 国产一区二区在线视频| 亚洲h精品动漫在线观看| 久久精品视频免费| 51精品久久久久久久蜜臀| 97久久久精品综合88久久| 午夜久久电影网| 亚洲丝袜美腿综合| 欧美一区二区在线播放| 欧美国产精品专区| 精品国产乱码久久久久久老虎| 欧美中文一区二区三区| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产成人综合视频| 精品一区二区久久| 久久精品国产久精国产| 日本强好片久久久久久aaa| 日韩高清在线电影| 天天操天天干天天综合网| 一区二区在线观看免费视频播放| 最新成人av在线| 亚洲六月丁香色婷婷综合久久| 中文字幕制服丝袜一区二区三区 | 久久99精品久久久久| 日本不卡一区二区三区高清视频| 国产成人精品午夜视频免费| 色久优优欧美色久优优| 欧美tickling网站挠脚心| 国产日韩欧美综合一区| 亚洲国产色一区| 成人天堂资源www在线| 欧美日韩aaa| 国产精品天天摸av网| 丝袜美腿高跟呻吟高潮一区| 国产91精品一区二区麻豆亚洲| 欧美在线高清视频| 国产欧美一区二区精品性 | 在线播放视频一区| 亚洲欧洲精品一区二区三区不卡| 日韩精品免费视频人成| 99久久久免费精品国产一区二区| 精品国产电影一区二区|