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

PHPにおけるリフレクションの仕組みを詳しく解説

小云云
小云云オリジナル
2018-03-30 15:29:091872ブラウズ


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


class Person {  
    /** 
     * For the sake of demonstration, we"re setting this private
     */ 
    private $_allowDynamicAttributes = false;
 
    /** type=primary_autoincrement */
    protected $id = 0;
 
    /** type=varchar length=255 null */
    protected $name;
 
    /** type=text null */
    protected $biography;
 
        public function getId()
        {
        	return $this->id;
        }
        public function setId($v)
        {
           	$this->id = $v;
        }
        public function getName()
        {
       		return $this->name;
        }
        public function setName($v)
        {
         	$this->name = $v;
        }
        public function getBiography()
        {
          	return $this->biography;
        }
        public function setBiography($v)
        {
         	$this->biography = $v;
        }
}

次に反映するには、ReflectionClassにクラス名「person」を渡すだけです:


$class = new ReflectionClass('Person');//建立 Person这个类的反射类
$instance  = $class->newInstanceArgs($args);//相当于实例化Person 类

1) プロパティを取得します(Properties):

$properties = $class->getProperties();
foreach($properties as $property) {
    echo $property->getName()."\n";
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography

デフォルトでは、ReflectionClassのプライベート属性やプライベート属性を含むすべての属性が取得されます。保護されたもの。プライベート プロパティのみを取得したい場合は、追加のパラメーターを渡す必要があります:

$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);

利用可能なパラメーター リスト:
ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUB LIC
ReflectionProperty:: Is_protected
ReflectionProperty :: is_private
Public 属性と Private 属性を同時に取得したい場合は、 ReflectionProperty :: is_public :: is_protected | と記述します。
$property->getName() を通じてプロパティ名を取得できます。


2) コメントの取得:

getDocComment を通じてプロパティに書き込まれたコメントを取得できます。

foreach($properties as $property) {
    if($property->isProtected()) {
        $docblock = $property->getDocComment();
        preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);
        echo $matches[1]."\n";
    }
}
// Output:
// primary_autoincrement
// varchar
// text

3) クラスのメソッドを取得します

メソッド (メソッド) を取得: getMethods() を通じてクラスのすべてのメソッドを取得します。


4) 実行クラスメソッド:

$instance->getBiography(); //执行Person 里的方法getBiography
//或者:
$ec=$class->getmethod('getName');  //获取Person 类中的getName方法
$ec->invoke($instance);       //执行getName 方法

関連推奨事項:

PHPリフレクション機構の詳細説明

リフレクション機構に基づくPHPによる自動依存性注入の詳細説明 PHPリフレクションに基づく自動依存性注入の詳細説明仕組み

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。