ホームページ >バックエンド開発 >PHPチュートリアル >PHPリフレクションAPIの簡単なチュートリアル

PHPリフレクションAPIの簡単なチュートリアル

伊谢尔伦
伊谢尔伦オリジナル
2017-07-01 10:40:301152ブラウズ

リフレクション API について言えば、PHP のリフレクション API は Java の java.lang.reflect パッケージに似ていると思います。どちらも、クラス メンバーの属性とメソッドを出力および分析できる一連の組み込みクラスで構成されています。 。 get_class_vars() などのオブジェクト関数をすでに学習しているかもしれませんが、リフレクション API を使用すると、より柔軟で、出力情報がより詳細になります。

まず第一に、リフレクション API はクラスをチェックするために使用されるだけでなく、それ自体にさまざまな機能を完了するためのクラスのセットが含まれていることを知っておく必要があります。一般的に使用されるクラスは次のとおりです:






従来の印刷情報とリフレクションAPIの違い
以下は、リフレクションの使用を示すために私が自分で書いたパラメーター プログラムです:

<?php

class Person
{
    //成员属性
    public $name;
    public $age; 

    //构造方法
    public function construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }

    //成员方法
    public function set_name($name)
    {
        $this->$name = $name;
    }

    public function get_name()
    {
        return $this->$name;
    }

    public function get_age()
    {
        return $this->$age;
    }

    public function get_user_info()
    {
        $info = &#39;姓名:&#39; . $this->name;
        $info .= &#39; 年龄:&#39; . $this->age;
        return $info;
    }
}

class Teacher extends Person
{
    private $salary = 0;

    public function construct($name, $age, $salary)
    {
        parent::construct($name, $age);
        $this->salary = $salary;
    }

    public function get_salary()
    {
        return $this->$salary;
    }

    public function get_user_info()
    {
        $info = parent::get_user_info();
        $info .= " 工资:" . $this->salary;
        return $info;
    }
}

class Student extends Person
{
    private $score = 0;

    public function construct($name, $age, $score)
    {
        parent::construct($name, $age);
        $this->score = $score;
    }

    public function get_score()
    {
        return $this->score;        
    }

    public function get_user_info()
    {
        $info = parent::get_user_info();
        $info .= " 成绩:" . $this->score;
        return $info;
    }
}

header("Content-type:text/html;charset=utf8;");
$te_obj = new Teacher(&#39;李老师&#39;, &#39;36&#39;, &#39;2000&#39;);
$te_info = $te_obj->get_user_info();

$st_obj = new Student(&#39;小明&#39;, &#39;13&#39;, &#39;80&#39;);
$st_info = $st_obj->get_user_info();

以下に示すように、最初に var_dump(); を使用してクラス情報を出力します。クラスに関する簡単な情報はなく、メソッドさえありません。したがって、そのような情報から他の水泳情報が見えてくることはありません。以下に示すように、Reflection によって提供される組み込みのエクスポート メソッドを使用して情報を出力します。 出力される情報は比較的完全で、メンバー属性、メンバー メソッド、クラスの基本情報、ファイル パス、メソッド情報、メソッド属性、パラメーター転送が含まれます。ステータス、ファイルの行数など。クラス情報の比較的包括的な表示。 var_dump() または print_r はクラスの簡単な情報しか表示できず、多くの情報はまったく表示できないため、リフレクション API はクラスに関する詳細情報を提供するだけであることがわかります。これは、クラスを呼び出す状況を知っているため、インターフェイスを作成する場合、特に他の人のインターフェイスを呼び出す場合に非常に便利です。何か問題が発生した場合のデバッグにも役立ちます。

object(Teacher)#1 (3) {
      ["salary":"Teacher":private]=>
          string(4) "2000"
      ["name"]=>
          string(9) "李老师"
      ["age"]=>
          string(2) "36"
}

リフレクション API の具体的な使用法:

フレームワークのソース コードを読んだ生徒は、フレームワークがサードパーティのプラグイン、クラス ライブラリなどをロードできることを知っています。次の例では、この関数をリフレクション API を使用して単純に実装しています。この例のプロトタイプを本で学び、自分の考えに従ってセットを作成しました。 実現したい関数: クラスを使用して動的に実行します。プロパティ クラスをトラバースして呼び出す オブジェクトとクラスは、クラスを既存のコードに埋め込んだり、クラス ライブラリ コードを手動で呼び出したりすることなく、他のクラスのメソッドを自由にロードできます。 規則: 各クラスには作業メソッドが含まれている必要があり、インターフェイスを抽象化できます。各クラスライブラリの情報に相当する各クラスの情報をファイルに記述し、クラスが保存した Property クラスライブラリの対応するオブジェクトを通じて各クラスライブラリの work メソッドを呼び出すことができます。

以下は基本的なコードです:

object(Teacher)#1 (3) {
      ["salary":"Teacher":private]=>
          string(4) "2000"
      ["name"]=>
          string(9) "李老师"
      ["age"]=>
          string(2) "36"
}
Class [  class Person ] {
      @@ /usr/local/www/phptest/oop/reflaction.php 3-38
      - Constants [0] {
      }
      - Static properties [0] {
      }
      - Static methods [0] {
 }
  - Properties [2] {
        Property [  public $name ]
        Property [  public $age ]
  }

  - Methods [5] {
    Method [  public method construct ] {
      @@ /usr/local/www/phptest/oop/reflaction.php 10 - 14

      - Parameters [2] {
        Parameter #0 [  $name ]

.....
ここでは、Property インターフェースを実装するために 2 つの類似したクラスが定義されています。両方とも、単純に work() メソッドを実装しています。パラメーターには Person オブジェクトが必要です。ファイルを使用して保存することもでき、各クラスの情報をメンバー属性に置き換えることもできます。

/*属性接口*/
interface Property
{
    function work();
}

class Person
{
    public $name;
    public function construct($name)
    {
        $this->name = $name;
    }
}

class StudentController implements Property
{
    //set方法,但需要Person对象参数
    public function setPerson(Person $obj_person)
    {
        echo &#39;Student &#39; . $obj_person->name;
    }

    //work方法简单实现
    public function work()
    {
        echo &#39;student working!&#39;;
    }
}

class EngineController implements Property
{
    //set方法
    public function setWeight($weight)
    {
        echo &#39;this is engine -> set weight&#39;;
    }

    public function setPrice($price)
    {
        echo "this is engine -> set price";
    }

    //work方法简单实现
    public function work()
    {
        echo &#39;engine working!&#39;;
    }
}
このプログラムの最後に、Run スタートアップは、対応するメソッド操作の初期化と実行を含め、ロードされるクラス ライブラリの他のメンバー プロパティを初期化するコンストラクターを自動的に呼び出します。ここでは、対応する set メソッドのみを示します。完成しました。 $mod_arr 属性は呼び出しクラスのすべてのオブジェクトを保存します。各オブジェクトにはデータが含まれており、含まれるオブジェクトを走査して work() メソッドを呼び出すことができます。


このプログラムは、リフレクション PAI を理解するためにのみ使用されます。各機能は完全ではありません。各メソッドの概要は以下のとおりです。

Reflection API によって提供される共通のクラスと関数

:

以下に提供される関数は、すべてではなく一般的に使用される関数であり、一部の関数はまったく使用されないため、以下の関数を作成する必要があります。嘘、考え それらすべてを見るには、オンラインで検索できます。たくさんあります。提供されている一連のメソッドを記憶する必要はなく、使用するときに復習できます。 りー

Reflection クラス クラスの基本情報を出力できます (提供されている静的 import() 関数を通じて)
ReflectionMethod クラス 名前を見て意味を知り、クラスメソッドを出力してください、メソッドの特定の情報などを取得します
ReflectionClass class は、クラスに含まれるメソッド、クラスの属性、抽象かどうかなどのクラス情報を取得するために使用されますクラスなど
ReflectionParameterクラス 動的である可能性のあるパラメータ情報を表示します 既知のメソッドのパラメータ受け渡し状況を取得します
ReflectionExceptionクラス エラーメッセージを表示するために使用されます
ReflectionExtensionクラス PHP拡張機能の情報を取得して、拡張機能が存在するかどうかを判断できます

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

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