日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php的反射技术,PHP 反射使用

發布時間:2025/3/20 php 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php的反射技术,PHP 反射使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一節 主要系統講了反射的用法,雖然講解了用法,但是沒有對其在項目中的實際使用做講解,不學以致用,不如不學。

在好多框架底層實現上面使用了反射,所以要理解和分析框架底層源碼的話,必須掌握反射,不然的話理解十分的困難。

下面我們講下反射在實際開發中的應用。

自動生成文檔

實現 MVC 架構

實現單元測試

配合 DI 容器解決依賴

自動生成文檔

根據反射的分析類,接口,函數和方法的內部結構,方法和函數的參數,以及類的屬性和方法,可以自動生成文檔。

/**

* 學生類

*

* 描述信息

*/

class Student

{

const NORMAL = 1;

const FORBIDDEN = 2;

/**

* 用戶ID

* @var 類型

*/

public $id;

/**

* 獲取id

* @return int

*/

public function getId()

{

return $this->id;

}

public function setId($id = 1)

{

$this->id = $id;

}

}

$ref = new ReflectionClass('Student');

$doc = $ref->getDocComment();

echo $ref->getName() . ':' . getComment($ref) , "\n";

echo "屬性列表:\n";

printf("%-15s%-10s%-40s\n", 'Name', 'Access', 'Comment');

$attr = $ref->getProperties();

foreach ($attr as $row) {

printf("%-15s%-10s%-40s\n", $row->getName(), getAccess($row), getComment($row));

}

echo "常量列表:\n";

printf("%-15s%-10s\n", 'Name', 'Value');

$const = $ref->getConstants();

foreach ($const as $key => $val) {

printf("%-15s%-10s\n", $key, $val);

}

echo "\n\n";

echo "方法列表\n";

printf("%-15s%-10s%-30s%-40s\n", 'Name', 'Access', 'Params', 'Comment');

$methods = $ref->getMethods();

foreach ($methods as $row) {

printf("%-15s%-10s%-30s%-40s\n", $row->getName(), getAccess($row), getParams($row), getComment($row));

}

// 獲取權限

function getAccess($method)

{

if ($method->isPublic()) {

return 'Public';

}

if ($method->isProtected()) {

return 'Protected';

}

if ($method->isPrivate()) {

return 'Private';

}

}

// 獲取方法參數信息

function getParams($method)

{

$str = '';

$parameters = $method->getParameters();

foreach ($parameters as $row) {

$str .= $row->getName() . ',';

if ($row->isDefaultValueAvailable()) {

$str .= "Default: {$row->getDefaultValue()}";

}

}

return $str ? $str : '';

}

// 獲取注釋

function getComment($var)

{

$comment = $var->getDocComment();

// 簡單的獲取了第一行的信息,這里可以自行擴展

preg_match('/\* (.*) *?/', $comment, $res);

return isset($res[1]) ? $res[1] : '';

}

復制代碼

運行 php file.php 就可以看到相應的文檔信息。

實現 MVC 架構

現在好多框架都是 MVC 的架構,根據路由信息定位 控制器(controller)和方法(controller) 和方法(controller)和方法(method) 的名稱,之后使用反射實現自動調用。

$class = new ReflectionClass(ucfirst($controller) . 'Controller');

$controller = $class->newInstance();

if ($class->hasMethod($method)) {

$method = $class->getMethod($method);

$method->invokeArgs($controller, $arguments);

} else {

throw new Exception("{$controller} controller method {$method} not exists!");

}

復制代碼

實現單元測試

一般情況下我們會對函數和類進行測試,判斷其是否能夠按我們預期返回結果,我們可以用反射實現一個簡單通用的類測試用例。

class Calc

{

public function plus($a, $b)

{

return $a + $b;

}

public function minus($a, $b)

{

return $a - $b;

}

}

function testEqual($method, $assert, $data)

{

$arr = explode('@', $method);

$class = $arr[0];

$method = $arr[1];

$ref = new ReflectionClass($class);

if ($ref->hasMethod($method)) {

$method = $ref->getMethod($method);

$res = $method->invokeArgs(new $class, $data);

var_dump($res === $assert);

}

}

testEqual('Calc@plus', 3, [1, 2]);

testEqual('Calc@minus', -1, [1, 2]);

復制代碼

這是類的測試方法,也可以利用反射實現函數的測試方法。

這里只是我簡單寫的一個測試用例,PHPUnit 單元測試框架很大程度上依賴了 Reflection 的特性,可以了解下。

配合 DI 容器解決依賴

Laravel 等許多框架都是使用 Reflection 解決依賴注入問題,具體可查看 Laravel 源碼進行分析。

下面我們代碼簡單實現一個 DI 容器演示 Reflection 解決依賴注入問題。

class DI

{

protected static $data = [];

public function __set($k, $v)

{

self::$data[$k] = $v;

}

public function __get($k)

{

return $this->bulid(self::$data[$k]);

}

// 獲取實例

public function bulid($className)

{

// 如果是匿名函數,直接執行,并返回結果

if ($className instanceof Closure) {

return $className($this);

}

// 已經是實例化對象的話,直接返回

if(is_object($className)) {

return $className;

}

// 如果是類的話,使用反射加載

$ref = new ReflectionClass($className);

// 監測類是否可實例化

if (!$ref->isInstantiable()) {

throw new Exception('class' . $className . ' not find');

}

// 獲取構造函數

$construtor = $ref->getConstructor();

// 無構造函數,直接實例化返回

if (is_null($construtor)) {

return new $className;

}

// 獲取構造函數參數

$params = $construtor->getParameters();

// 解析構造函數

$dependencies = $this->getDependecies($params);

// 創建新實例

return $ref->newInstanceArgs($dependencies);

}

// 分析參數,如果參數中出現依賴類,遞歸實例化

public function getDependecies($params)

{

$data = [];

foreach($params as $param)

{

$tmp = $param->getClass();

if (is_null($tmp)) {

$data[] = $this->setDefault($param);

} else {

$data[] = $this->bulid($tmp->name);

}

}

return $data;

}

// 設置默認值

public function setDefault($param)

{

if ($param->isDefaultValueAvailable()) {

return $param->getDefaultValue();

}

throw new Exception('no default value!');

}

}

class Demo

{

public function __construct(Calc $calc)

{

echo $calc->plus(1, 2);

}

}

$di = new DI();

$di->calc = 'Calc'; // 加載單元測試用例中 Calc 類

$di->demo = 'Demo';

$di->demo;

復制代碼

注意上面的 calc 和 demo 的順序,不能顛倒,不然的話會報錯,原因是由于 Demo 依賴 Calc,首先要定義依賴關系。

在 Demo 實例化的時候,會用到 Calc 類,也就是說 Demo 依賴于 Calc,但是在 $data 上面找不到的話,會拋出錯誤,所以首先要定義 $di->calc = 'Calc'。

Reflection 是一個非常 Cool 的功能,使用它,但不要濫用它。

?版權聲明:原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 & 作者信息。

End

堅持原創技術分享,您的支持將鼓勵我繼續創作! 賞

微信打賞

支付寶打賞

總結

以上是生活随笔為你收集整理的php的反射技术,PHP 反射使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 麻豆传媒一区二区三区 | 国产女人高潮毛片 | 亚洲无人区码一码二码三码 | 毛片免费在线观看视频 | 不卡的中文字幕 | 欧美自拍一区 | 五月婷婷婷 | 伊人草草 | 国产超级av | 阿娇全套94张未删图久久 | 精品二区在线观看 | 国产一区二区激情 | 天天爽网站 | 日av中文字幕 | 中文字幕一区二区三区在线观看 | 亚洲国产免费看 | 国产av一区二区不卡 | 五月天小说网 | 粉嫩av在线 | 欧美精品hd | 欧美婷婷六月丁香综合色 | 女性女同性aⅴ免费观女性恋 | 亚洲精品成人无码 | 深夜网站在线 | 中国黄色录像 | 伊人网成人网 | 女裸全身无奶罩内裤内衣内裤 | 成人免费看片载 | 亚洲第一香蕉网 | 舒淇裸体午夜理伦 | 亚洲a在线观看 | 91国偷自产一区二区三区老熟女 | 亚洲电影在线看 | 亚洲欧洲一区二区三区 | 强迫凌虐淫辱の牝奴在线观看 | 久久国产精品久久久久久电车 | 欧美成人一区二免费视频软件 | 国产大片在线观看 | 亚洲日本香蕉视频 | 亚洲综合小说网 | 色偷偷欧美| 免费污片网站 | 一级黄色片视频 | av污 | 国产h视频 | 日韩久久一区二区 | 男生操男生网站 | 午夜簧片 | 夜夜操天天射 | 久久人人干| 欧美日韩国产a | 日韩夫妻性生活 | 看片日韩 | 男人的天堂va | 国产精品第157页 | 无码人妻精品一区二区蜜桃网站 | 亚洲精选一区二区三区 | 污污内射久久一区二区欧美日韩 | 亚洲精品日本 | 美女脱得一干二净 | 亚洲国产成人在线视频 | 女人做爰全过程免费观看美女 | 午夜a级片| 99爱精品视频 | 免费日韩毛片 | 欧美一区2区三区4区公司 | 91久久精品一区二区 | 国产三级理论片 | 成人无码久久久久毛片 | 欧美亚韩一区二区三区 | 亚洲精品一区二区三区蜜桃久 | 91影院在线免费观看 | 性生生活性生交a级 | 视频在线观看电影完整版高清免费 | 激情中文字幕 | 日本福利视频导航 | 亚洲AV无码国产精品午夜字幕 | 强行挺进白丝老师翘臀网站 | 911美女片黄在线观看游戏 | 福利网站在线观看 | 亚洲AV无码精品一区二区三区 | 99成人在线观看 | 伊人久久在线 | 欧美视频色 | 一区二区三区播放 | 99精品无码一区二区 | 激情小视频| 日韩欧美精品 | 日本午夜在线视频 | 亚洲无限看 | 国产成人无码精品久久久久久 | 亚洲六月丁香色婷婷综合久久 | 怡红院av在线 | 国产精品自拍在线 | 亚洲自拍偷拍一区二区三区 | 日本免费三片在线播放 | a级片在线免费观看 | av波多野吉衣 | 少妇熟女一区二区三区 |