国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - Laravel框架源碼解析之反射的使用詳解

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

2020-06-24 15:01CrazyCodes PHP教程

這篇文章主要介紹了Laravel框架源碼解析之反射的使用,結合實例形式詳細分析了Laravel源碼解析中反射的基本原理、使用方法及操作注意事項,需要的朋友可以參考下

本文實例講述了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

 

栗子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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());
?>

輸出結果

?
1
2
3
4
5
6
7
8
9
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$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

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

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

 

Illuminate\Foundation\Application

?
1
2
3
4
5
6
7
8
9
10
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]); 為例來講解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 真正的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框架的PHP程序設計有所幫助。

原文鏈接:https://segmentfault.com/a/1190000016480587

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日日操视频 | 能看的av网站| www国产精品 | 草久久av | 亚洲精品电影网在线观看 | 在线一级电影 | 一区二区三区四区在线 | 亚洲精品成人在线 | 99久久婷婷国产精品综合 | 亚洲福利一区二区 | 国产精品国产三级国产aⅴ中文 | 91天天综合| 久久精品麻豆 | 欧美成人综合 | 一本一本久久a久久精品综合妖精 | 久久久一区二区三区 | 在线不卡a资源高清 | 免费级毛片 | 97久久精品人人做人人爽50路 | 免费人成电影 | 国产激情偷乱视频一区二区三区 | 欧美一区二区三区在线视频 | 日韩成人影院 | 欧美日韩亚洲一区二区 | 久久久久久亚洲 | 精品一区二区三区成人精品 | 毛片a级 | 日本高清视频在线播放 | 国产欧美日本 | 香蕉视频成人在线观看 | 中文字幕在线观看 | 永久免费看黄网站 | 久久久久久亚洲精品中文字幕 | 91av导航 | 激情国产 | 国产精品成人一区二区三区 | 精品国产乱码久久久久久密桃99 | 污片在线免费看 | av电影免费在线观看 | 中国黄色免费网站 | 欧美日韩国产一区二区三区不卡 |