ホームページ  >  記事  >  バックエンド開発  >  PHPにおけるリフレクションの使い方を詳しく解説

PHPにおけるリフレクションの使い方を詳しく解説

coldplay.xixi
coldplay.xixi転載
2020-06-16 17:46:292510ブラウズ

PHPにおけるリフレクションの使い方を詳しく解説

# 実際の開発におけるリフレクションの適用について話しましょう。

  • ドキュメントを自動生成する
  • 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] : '';
}

PHPにおけるリフレクションの使い方を詳しく解説

#単体テストの実装

一般に、関数とクラスをテストして、期待どおりの結果を返せるかどうかを判断します。単純で一般的なクラスのテスト ケースを実装します。


うわー

これはクラスのテスト メソッドであり、リフレクションを使用して関数のテスト メソッドを実装することもできます。

これは私が単純に書いたテスト ケースです。
PHPUnit 単体テスト フレームワークは Reflection の機能に大きく依存しており、詳細についてはこちらをご覧ください。

DI コンテナと連携して依存関係を解決する

Laravel 依存関係注入の問題を解決するには、Reflection などの多くのフレームワークが使用されます。 Laravel 分析用のソースコード。 以下のコードは、依存関係注入の問題を解決するために、
DI コンテナーのデモ Reflection を単純に実装しています。
うわー

上記の

calcdemo の順序は逆にできないことに注意してください。逆にしないと、エラーが報告されます。その理由は、Demo が ## に依存しているためです。 #Calc 、最初に依存関係を定義します。 Demo がインスタンス化されると、
Calc クラスが使用されます。つまり、DemoCalc に依存しますが、## に依存します。 #$data 上記が見つからない場合はエラーがスローされるため、最初に。 リフレクションは非常に優れた機能なので、ぜひ使用してください。ただし、乱用しないでください。 #終了オリジナルのテクノロジーを共有することを主張し、あなたのサポートが私を続ける励みになります

推奨チュートリアル: "

php チュートリアル

"

以上がPHPにおけるリフレクションの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。