PHPでのリフレクションの応用

不言
リリース: 2023-03-30 19:48:02
オリジナル
1476 人が閲覧しました

この記事では、主に PHP でのリフレクションの応用、リフレクションとは何か、リフレクションの役割について詳しく紹介します。興味のある方は参考にしてください。

リフレクションは PHP の実行状態にあり、extend します。 PHP プログラムの分析、クラス、メソッド、プロパティ、パラメーターなどに関するコメントを含む詳細情報をエクスポートまたは抽出します。この動的に情報を取得し、オブジェクトのメソッドを動的に呼び出す機能をリフレクションAPIと呼びます。リフレクションは、オブジェクト指向パラダイムでメタモデルを操作するための API であり、非常に強力で、複雑でスケーラブルなアプリケーションの構築に役立ちます。
その用途には、プラグインの自動ロード、ドキュメントの自動生成が含まれ、PHP 言語の拡張にも使用できます。
php リフレクション API は、プログラムのメタデータにアクセスしたり、関連する注釈と対話したりするのに役立ついくつかのクラスで構成されています。リフレクションの助けを借りて、クラスによって実装されたメソッドを取得し、クラスのインスタンスを作成し (new による作成とは異なります)、メソッドを呼び出し (これも通常の呼び出しとは異なります)、パラメーターを渡し、静的メソッドを動的に呼び出すことができます。クラスのメソッド。
Reflection API は、いくつかのクラス、例外、インターフェイスを含む PHP の組み込み oop テクノロジ拡張機能であり、これらを組み合わせて使用​​すると、他のクラス、インターフェイス、メソッド、プロパティ、メソッド、拡張機能の分析に役立ちます。これらの oop 拡張はリフレクションと呼ばれます。
ReflectionClass を通じて、Person クラスの次の情報を取得できます。

1) 定数の内容
2) プロパティのプロパティ名
3) メソッド名 static
4) 静的プロパティ
5) 名前空間 Namespace
6) personクラスがfinalかabstractかどうか

次に、thinkphpのソースコードを見に行きました。 MVC の実装も さまざまなエクスペリエンス ThinkPHP\Lib\Core\App.class.php

if(!preg_match('/^[A-Za-z](\w)*$/',$action)){
    // 非法操作
    throw new ReflectionException();
   }
   //执行当前操作
   $method = new ReflectionMethod($module, $action); #查看方法
   if($method->isPublic()) {
    $class = new ReflectionClass($module); #反射控制器
    // 前置操作
    if($class->hasMethod('_before_'.$action)) {
     $before = $class->getMethod('_before_'.$action);
     if($before->isPublic()) {
      $before->invoke($module);
     }
    }
    // URL参数绑定检测
    if(C('URL_PARAMS_BIND') && $method->getNumberOfParameters()>0){
     switch($_SERVER['REQUEST_METHOD']) {
      case 'POST':
       $vars = $_POST;
       break;
      case 'PUT':
       parse_str(file_get_contents('php://input'), $vars);
       break;
      default:
       $vars = $_GET;
     }
     $params = $method->getParameters();
     foreach ($params as $param){
      $name = $param->getName();
      if(isset($vars[$name])) {
       $args[] = $vars[$name];
      }elseif($param->isDefaultValueAvailable()){
       $args[] = $param->getDefaultValue();
      }else{
       throw_exception(L('_PARAM_ERROR_').':'.$name);
      }
     }
     $method->invokeArgs($module,$args);
    }else{
     $method->invoke($module); #执行我们需要调用函数
    }
    // 后置操作
    if($class->hasMethod('_after_'.$action)) {
     $after = $class->getMethod('_after_'.$action);
     if($after->isPublic()) {
      $after->invoke($module);
     }
    }
ログイン後にコピー

の exec メソッド 上記は内容全体ですこの記事が皆様のお役に立てれば幸いです。学習が役立つ場合は、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

PHP ツリーを実装する非再帰的方法

php カプセル化データベース関数と使用法

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート