# 実際の開発におけるリフレクションの適用について話しましょう。
- ドキュメントを自動生成する
- MVC アーキテクチャを実装する
- 単体テストを実装する
- DI コンテナと連携して依存関係を解決する
- …
ドキュメントの自動生成
クラス、インターフェース、関数やメソッドの内部構造、メソッドや関数のパラメータ、属性やメソッドのリフレクション分析に基づいてドキュメントを自動生成できます。クラスの。
php file.php
を実行して、対応するドキュメント情報を確認します。
MVC アーキテクチャの実装
現在、多くのフレームワークに MVC
アーキテクチャが採用されています。コントローラ ($controller) とメソッド ($method) の名前は、ルーティング情報を設定し、リフレクションを使用して自動呼び出しを実装します。
#
/** * 学生类 * * 描述信息 */ 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] : ''; }
うわー
これは私が単純に書いたテスト ケースです。
PHPUnit 単体テスト フレームワークは
Reflection の機能に大きく依存しており、詳細についてはこちらをご覧ください。
Laravel 依存関係注入の問題を解決するには、
Reflection などの多くのフレームワークが使用されます。
Laravel 分析用のソースコード。
以下のコードは、依存関係注入の問題を解決するために、
DI コンテナーのデモ
Reflection を単純に実装しています。
うわー
calc と
demo の順序は逆にできないことに注意してください。逆にしないと、エラーが報告されます。その理由は、
Demo が ## に依存しているためです。 #Calc
、最初に依存関係を定義します。 Demo
がインスタンス化されると、
Calc クラスが使用されます。つまり、
Demo は
Calc に依存しますが、## に依存します。 #$data
上記が見つからない場合はエラーがスローされるため、最初に。 リフレクションは非常に優れた機能なので、ぜひ使用してください。ただし、乱用しないでください。
#終了
オリジナルのテクノロジーを共有することを主張し、あなたのサポートが私を続ける励みになります
php チュートリアル
"