ホームページ >バックエンド開発 >PHPチュートリアル >PHP変数のリフレクションと使用、および型拡張

PHP変数のリフレクションと使用、および型拡張

伊谢尔伦
伊谢尔伦オリジナル
2016-11-21 16:58:131110ブラウズ

1. 概要とインストール

PHP 5 には完全なリフレクション API があり、クラス、インターフェイス、関数、メソッド、拡張機能をリバース エンジニアリングする機能が追加されています。 さらに、Reflection API は、関数、クラス、メソッドからドキュメント コメントを抽出するメソッドを提供します。

一部の内部 API には、リフレクション拡張機能が機能するために必要なコードが欠落していることに注意してください。 たとえば、組み込みの PHP クラスで、反映されたプロパティのデータが欠落している可能性があります。ただし、これらのまれなケースはバグとみなされているため、発見して修正する必要があります。

これらの関数を使用するためにインストールは必要ありません。これらは PHP コアの一部です。

2. 使用例

リフレクションのドキュメントには多くの例があり、通常は各クラスの __construct ドキュメントにあります。

例 シェル(端末)でのリフレクション例

$ php --rf strlen
$ php --rc finfo
$ php --re json
$ php --ri dom

上記ルーチンの出力類似したもの:

Function [ <internal:Core> function strlen ] {
  - Parameters [1] {
    Parameter #0 [ <required> $str ]
  }
}
Class [ <internal:fileinfo> class finfo ] {
  - Constants [0] {
  }
  - Static properties [0] {
  }
  - Static methods [0] {
  }
  - Properties [0] {
  }
  - Methods [4] {
    Method [ <internal:fileinfo, ctor> public method finfo ] {
      - Parameters [2] {
        Parameter #0 [ <optional> $options ]
        Parameter #1 [ <optional> $arg ]
      }
    }
    Method [ <internal:fileinfo> public method set_flags ] {
      - Parameters [1] {
        Parameter #0 [ <required> $options ]
      }
    }
    Method [ <internal:fileinfo> public method file ] {
      - Parameters [3] {
        Parameter #0 [ <required> $filename ]
        Parameter #1 [ <optional> $options ]
        Parameter #2 [ <optional> $context ]
      }
    }
    Method [ <internal:fileinfo> public method buffer ] {
      - Parameters [3] {
        Parameter #0 [ <required> $string ]
        Parameter #1 [ <optional> $options ]
        Parameter #2 [ <optional> $context ]
      }
    }
  }
}
Extension [ <persistent> extension #23 json version 1.2.1 ] {
  - Constants [10] {
    Constant [ integer JSON_HEX_TAG ] { 1 }
    Constant [ integer JSON_HEX_AMP ] { 2 }
    Constant [ integer JSON_HEX_APOS ] { 4 }
    Constant [ integer JSON_HEX_QUOT ] { 8 }
    Constant [ integer JSON_FORCE_OBJECT ] { 16 }
    Constant [ integer JSON_ERROR_NONE ] { 0 }
    Constant [ integer JSON_ERROR_DEPTH ] { 1 }
    Constant [ integer JSON_ERROR_STATE_MISMATCH ] { 2 }
    Constant [ integer JSON_ERROR_CTRL_CHAR ] { 3 }
    Constant [ integer JSON_ERROR_SYNTAX ] { 4 }
  }
  - Functions {
    Function [ <internal:json> function json_encode ] {
      - Parameters [2] {
        Parameter #0 [ <required> $value ]
        Parameter #1 [ <optional> $options ]
      }
    }
    Function [ <internal:json> function json_decode ] {
      - Parameters [3] {
        Parameter #0 [ <required> $json ]
        Parameter #1 [ <optional> $assoc ]
        Parameter #2 [ <optional> $depth ]
      }
    }
    Function [ <internal:json> function json_last_error ] {
      - Parameters [0] {
      }
    }
  }
}
dom
DOM/XML => enabled
DOM/XML API Version => 20031129
libxml Version => 2.7.3
HTML Support => enabled
XPath Support => enabled
XPointer Support => enabled
Schema Support => enabled
RelaxNG Support => enabled

3. 関連拡張機能

組み込みクラスの特殊なバージョンを作成する場合 (たとえば、強調表示された HTML を作成およびエクスポートするとき、メソッドを簡単にアクセス可能なメンバー変数に置き換える、またはユーティリティ メソッドを使用する) 場合は、次のことができます。それらを継続し、拡張します。

例 #1 組み込みクラスの拡張

<?php
/**
* My Reflection_Method class
*/
class My_Reflection_Method extends ReflectionMethod
{
public $visibility = array();
public function __construct($o, $m)
{
parent::__construct($o, $m);
$this->visibility = Reflection::getModifierNames($this->getModifiers());
}
}
/**
* Demo class #1
*
*/
class T {
protected function x() {}
}
/**
* Demo class #2
*
*/
class U extends T {
function x() {}
}
// 输出信息
var_dump(new My_Reflection_Method(&#39;U&#39;, &#39;x&#39;));
?>
以上例程的输出类似于:
object(My_Reflection_Method)#1 (3) {
 ["visibility"]=>
 array(1) {
   [0]=>
   string(6) "public"
 }
 ["name"]=>
 string(1) "x"
 ["class"]=>
 string(1) "U"
}

コンストラクターをオーバーライドする場合は、挿入されたコードを記述する前に親クラスのコンストラクターを呼び出すことを忘れないでください。 これを行わないと、次の結果が発生します: 致命的エラー: 内部エラー: リフレクション オブジェクトの取得に失敗しました

4. Reflection クラス

Reflection — Reflection クラス

ReflectionClass — ReflectionClass クラス

ReflectionZendExtension — ReflectionZendExtension クラス

ReflectionExtension — ReflectionExtension クラス

ReflectionFunction — ReflectionFunction クラス

ReflectionFunctionAbstract — ReflectionFunctionAbstract クラス

ReflectionMethod — ReflectionMethod クラス

ReflectionObject — ReflectionObject クラス

ReflectionParameter — ionParameter クラス

ReflectionProperty — ReflectionProperty クラス

Reflector — リフレクター インターフェイス

ReflectionException — ReflectionException クラス


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