この記事では主にPHP Reflection APIの詳細な説明を紹介します この記事では、Reflectionクラス、ReflectionExceptionクラス、ReflectionFunctionクラス、ReflectionParameterクラス、ReflectionClassクラス、ReflectionMethodクラスなどについて説明します。参考にしてみてください
PHP Reflection APIは、PHP5でのみ利用できる新機能で、クラス、メソッド、プロパティ、パラメータなどに関するコメントを含む詳細情報をエクスポートまたは抽出するために使用されます。
PHP Reflection API には以下が含まれます:
?
1 2 3 4 5 6 7 8 9 10 |
クラスリフレクション{ } インターフェースリフレクター{ } クラス ReflectionException は例外 { } を拡張します クラス ReflectionFunction はリフレクター { } を実装します クラス ReflectionParameter はリフレクター { } を実装します クラス ReflectionMethod extends ReflectionFunction { } クラス ReflectionClass はリフレクター { } を実装します class ReflectionObject extends ReflectionClass { } クラス ReflectionProperty はリフレクター { } を実装します クラス ReflectionExtension はリフレクター { } を実装します |
具体的な API の説明:
①振り返り授業
?
1 2 3 4 5 6 7 8 9 |
クラスの振り返り { パブリック静的混合エクスポート(Reflector r [,bool return]) //クラスまたはメソッドの詳細情報をエクスポートします パブリック静的配列 getModifierNames(int modifiers) //モディファイアの名前を取得します } ?> |
②ReflectionExceptionクラス
このクラスは標準クラスを継承しており、特別なメソッドや属性はありません。
③ReflectionFunctionクラス
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
クラス ReflectionFunction はリフレクターを実装します { 最終プライベート __clone() パブリックオブジェクト __construct(文字列名) パブリック文字列 __toString() パブリック静的文字列エクスポート() //この関数の詳細情報をエクスポートします パブリック文字列getName() //関数名を取得 パブリックブール isInternal() //それがシステムの内部関数であるかどうかをテストします パブリックブール isUserDefined() //ユーザー定義関数かどうかをテストします パブリック文字列getFileName() //パス名を含むファイル名を取得します public int getStartLine() //関数が定義されている開始行を取得します public int getEndLine() //定義された関数の終了行を取得します パブリック文字列getDocComment() //関数のコメントを取得します パブリック配列 getStaticVariables() //静的変数を取得する パブリック混合呼び出し(混合*引数) //この関数を呼び出し、パラメータリストを介してパラメータを渡します パブリック混合invokeArgs(配列引数) //この関数を呼び出し、配列を通してパラメータを渡します public bool returnsReference() //関数が参照を返すかどうかをテストします パブリック ReflectionParameter[] getParameters() //このメソッドに必要なパラメータを取得し、戻り値はオブジェクト配列になります public int getNumberOfParameters() //このメソッドに必要なパラメータの数を取得します public int getNumberOfRequiredParameters() //このメソッドに必要なパラメータの数を取得します } ?> |
④ReflectionParameter类:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
クラス ReflectionParameter はリフレクターを実装します { 最終プライベート __clone() パブリックオブジェクト __construct(文字列名) パブリック文字列 __toString() パブリック静的文字列エクスポート() //このパラメータの詳細情報 パブリック文字列getName() //パラメータ名を取得 パブリックブール isPassedByReference() //测试该パラメータが过参照传递パラメータかどうか パブリック ReflectionClass getClass() //若该パラメータはオブジェクト、このオブジェクトのクラス名を返します パブリックブール isArray() //测试该パラメータが数組型であるかどうか パブリックブールはNull()を許可します //测试该パラメータが空かどうか public bool isOptional() //このパラメータが選択可能かどうかを確認し、パラメータが存在する場合は選択可能です パブリックブール isDefaultValueAvailable() //测试该パラメータが默认パラメータであるかどうか パブリック混合getDefaultValue() //このパラメータを取得しました } ?> |
⑤ReflectionClassクラス:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
クラス ReflectionClass はリフレクターを実装します { 最終プライベート __clone() パブリックオブジェクト __construct(文字列名) パブリック文字列 __toString() パブリック静的文字列エクスポート() //このクラスの詳細情報をエクスポートします パブリック文字列getName() //クラス名またはインターフェース名を取得します パブリックブール isInternal() //このクラスがシステムの内部クラスかどうかをテストします パブリックブール isUserDefined() //クラスがユーザー定義クラスかどうかをテストします パブリックブール isInstantiable() //クラスがインスタンス化されているかどうかをテストします public bool hasConstant(文字列名) //クラスに特定の定数があるかどうかをテストします public bool hasMethod(文字列名) //このクラスに特定のメソッドがあるかどうかをテストします public bool hasProperty(文字列名) //クラスに特定の属性があるかどうかをテストします パブリック文字列getFileName() //パス名を含む、このクラスを定義するファイル名を取得します public int getStartLine() //このクラスを定義する開始行を取得します public int getEndLine() //このクラスを定義する終了行を取得します パブリック文字列getDocComment() //このクラスのコメントを取得します パブリック ReflectionMethod getConstructor() //このクラスのコンストラクター情報を取得します パブリック ReflectionMethod getMethod(文字列名) //このクラスの特定のメソッド情報を取得します パブリック ReflectionMethod[] getMethods() //このクラスのすべてのメソッド情報を取得します public ReflectionProperty getProperty(文字列名) //特定の属性情報を取得する パブリック ReflectionProperty[] getProperties() //このクラスのすべての属性情報を取得します パブリック配列 getConstants() //このクラスのすべての定数情報を取得します パブリック混合getConstant(文字列名) //このタイプの特定の定数情報を取得します パブリック ReflectionClass[] getInterfaces() //インターフェースクラス情報を取得する パブリックブール isInterface() //クラスがインターフェースかどうかをテストします パブリックブール isAbstract() //クラスが抽象クラスかどうかをテストします パブリックブール isFinal() //クラスがfinalと宣言されているかどうかをテストします public int getModifiers() //このクラスの修飾子を取得します。戻り値の型はリソース型である可能性があります //Reflection::getModifierNames($class->getModifiers()) をさらに読んでください パブリックブール isInstance(stdclass オブジェクト) //渡されたオブジェクトがこのクラスのインスタンスであるかどうかをテストします パブリック stdclass newInstance(混合* 引数) //このクラスのインスタンスを作成します パブリック ReflectionClass getParentClass() //親クラスを取得します パブリックブール isSubclassOf(ReflectionClass クラス) //渡されたクラスがこのクラスの親クラスであるかどうかをテストします パブリック配列 getStaticProperties() //このクラスのすべての静的プロパティを取得します publicmixedgetStaticPropertyValue(文字列名[,混合デフォルト]) //このクラスの静的属性値を取得します。プライベートの場合はアクセスできません public void setStaticPropertyValue(文字列名、混合値) //このクラスの静的属性値を設定します。プライベートの場合、カプセル化の原則に違反し、アクセスできません。 パブリック配列 getDefaultProperties()//このクラスの静的属性を除く属性情報を取得します パブリックブール isIterateable() public boolimplementsInterface(文字列名) //特定のインターフェースが実装されているかどうかをテストします パブリック ReflectionExtension getExtension() パブリック文字列 getExtensionName() } ?>
|
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
クラス ReflectionMethod は ReflectionFunction を拡張します { public __construct(混合クラス、文字列名) パブリック文字列 __toString() パブリック静的文字列エクスポート() //このメソッドの情報をエクスポートします パブリック混合呼び出し(stdclassオブジェクト、混合*引数) //このメソッドを呼び出します パブリック混合invokeArgs(stdclassオブジェクト、配列引数) //このメソッドを呼び出して複数のパラメータを渡します パブリックブール isFinal() //メソッドがfinalであるかどうかをテストします パブリックブール isAbstract() //メソッドが抽象かどうかをテストします パブリックブール isPublic() //メソッドがパブリックかどうかをテストします パブリックブール isPrivate() //メソッドがプライベートかどうかをテストします パブリックブールはProtected() //メソッドが保護されているかどうかをテストします パブリックブール isStatic() //メソッドが静的かどうかをテストします パブリックブール isConstructor() //メソッドがコンストラクターかどうかをテストします パブリックブール isDestructor() //メソッドがデストラクターかどうかをテストします public int getModifiers() //このメソッドの修飾子を取得します パブリック ReflectionClass getDeclaringClass() //このメソッドが属するクラスを取得します // ReflectionFunction から継承 最終プライベート __clone() パブリック文字列getName() パブリックブール isInternal() パブリックブール isUserDefined() パブリック文字列getFileName() public int getStartLine() public int getEndLine() パブリック文字列getDocComment() パブリック配列 getStaticVariables() public bool returnsReference() パブリック ReflectionParameter[] getParameters() public int getNumberOfParameters() public int getNumberOfRequiredParameters() } ?>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
クラス ReflectionProperty はリフレクターを実装します { 最終プライベート __clone() public __construct(混合クラス、文字列名) パブリック文字列 __toString() パブリック静的文字列エクスポート() //このプロパティの詳細情報を出力します パブリック文字列getName() //プロパティ名を取得 パブリックブール isPublic() //测试该プロパティ名がpublicであるかどうか パブリックブール isPrivate() //プロパティ名がプライベートであるかどうかを確認します パブリックブールはProtected() //プロパティ名が保護されているかどうかを確認します パブリックブール isStatic() //プロパティ名が静的かどうかを確認します パブリックブール isDefault() public int getModifiers() //修饰符取得 パブリック混合getValue(stdclassオブジェクト) //取得プロパティ值 public void setValue(stdclass オブジェクト, 混合値) //設定プロパティ值 パブリック ReflectionClass getDeclaringClass() //このプロパティの属性を取得します パブリック文字列getDocComment() //このプロパティの注釈を取得します } ?> |
⑧ReflectionExtension类
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
クラス ReflectionExtension はリフレクターを実装します { 最終プライベート __clone() public __construct(文字列名) パブリック文字列 __toString() パブリック静的文字列エクスポート() //この展覧会のすべての情報 パブリック文字列getName() //この展の名前を取得しました パブリック文字列getVersion() //この展覧会のバージョンを取得しました パブリック ReflectionFunction[] getFunctions() //この展のすべての関数を取得します パブリック配列 getConstants() //この展覧会の全ての常量を取得しました パブリック配列 getINIEntries() // この展に関連する、php.ini 内の命令情報を取得します パブリック ReflectionClass[] getClasses() パブリック配列 getClassNames() }
?> |
使用例:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
クラスの人{ プライベート $_name;
公開 $age;
パブリック関数 __construct(){ $this->性別 = "男性"; }
パブリック関数アクション(){ エコー「http://www.bkjia.netからテスト」; } }
$class = 新しい ReflectionClass('人'); //属性を取得する foreach($class->getProperties() as $property) { echo $property->getName()."n"; } //取得方法 print_r($class->getMethods());
$p1 = 新しい人(); $obj = 新しい ReflectionObject($p1);
//オブジェクトとクラスのプロパティを取得します print_r($obj->getProperties()); |
上記のコードではオブジェクトとクラスで取得するプロパティが異なるのは明らかですが、これはオブジェクトがconstructによってインスタンス化されているため、PHP Reflectionは確かに多くの有用な情報を取得できます。
。