PHP の反映メカニズムとプラグイン アーキテクチャの実装の詳細な説明

WBOY
リリース: 2016-06-13 13:10:19
オリジナル
1083 人が閲覧しました

PHPのリフレクション機構とプラグインアーキテクチャの実装について詳しく解説

1.目的:
この拡張機能は、PHP プログラムを分析し、クラス、メソッド、プロパティ、パラメーターなどに関するコメントを含む詳細情報をエクスポートまたは抽出します。
リフレクションは、PHP ライブラリ関数「Classes/Objects クラス/オブジェクト関数」の拡張であると言えます。
主に既存のPHPプログラム内のクラスやメソッドなどの情報をプログラムを通じて検出し、処理するために使用されます。

2. API の概要:
class Reflection { }
interface Reflector { }
class ReflectionException extends Exception { }
class ReflectionFunctionimplements Reflector { }
class ReflectionParameterimplements Reflector { }
class ReflectionMethod extends ReflectionFunction { }
class ReflectionClassimplements Reflector { }
class ReflectionObject extends ReflectionClass { }
class ReflectionPropertyimplements Reflector { }
class ReflectionExtensionimplements Reflector { }

3.詳細説明: (例については php マニュアルを参照してください)
①Reflection class
class Reflection
{
??? Reflector r [,bool return] )
??? // クラスまたはメソッドの詳細情報をエクスポートします
??? public static array getModifierNames(int modifiers)
??? // モディファイアの名前を取得します
}
?>

②ReflectionException クラス

このクラスは標準クラスを継承しており、特別なメソッドや属性を持ちません。

③ReflectionFunction クラス
クラス ReflectionFunction は Reflector
{
??? 最終的な public オブジェクト __construct(文字列名) を実装します
??? public string __toString()
??? public static string export()
??? //関数の詳細をエクスポートします
??? >??? //関数名を取得します
??? public bool isInternal()
??? // システムの内部関数であるかどうかをテストします
???
?? //ユーザー定義関数であるかどうかをテストします
??? public string getFileName()
??? //パス名を含むファイル名を取得します? public int getStartLine()
??? // 定義された関数の開始行を取得します
??? public int getEndLine()
??? // 定義された関数の終了行を取得します🎜>??? public string getDocComment()
??? //関数のコメントを取得します
??? public array getStaticVariables()
??? //静的変数を取得します??? public mixed invoke(mixed* args)
? // この関数を呼び出してパラメータ リストを渡します
??? / /この関数を呼び出し、配列を通じてパラメータを渡します
??? public bool returnsReference()
??? //関数が参照を返すかどうかをテストします
???
??? // メソッドに必要なパラメータを取得し、戻り値は Array
??? public int getNumberOfParameters()
??? // に必要なパラメータの数を取得しますthis method
??? public int getNumberOfRequiredParameters()
??? //メソッドに必要なパラメータの数を取得
}
?>

④ReflectionParameter クラス:
class ReflectionParameter は Reflector
{
??? 最終的な private __clone()
??? public オブジェクト __construct(string name)
??? string __toString()
??? public static string export()
??? // パラメータの詳細情報をエクスポートします
??? //パラメータ名を取得します
??? public bool isPassedByReference()
??? //パラメータが参照によるパスであるかどうかをテストします
??? public ReflectionClass getClass()
??? / /パラメータがオブジェクトの場合、オブジェクトのクラス名を返します
??? public bool isArray()
?? //パラメータが配列型であるかどうかをテストします
? allowedNull()
??? //パラメータが null
であることが許可されているかどうかをテストします。 public bool isOptional()
??? //このパラメータがオプションであるかどうかをテストします。デフォルトパラメータ
??? public bool isDefaultValueAvailable()
??? //このパラメータがデフォルトパラメータであるかどうかをテストします
??? public mixedDefaultValue()
???このパラメータのデフォルト値
}
?>

⑤ReflectionClass クラス:
class ReflectionClass は Reflector
{
を実装します?final private __clone()
??? public object __construct(string name)
??? public string __toString()
??? //このクラスの詳細をエクスポートします
??? public string getName()
??? // クラス名またはインターフェイス名を取得します
??? // クラスがシステム内部クラスであるかどうかをテストします
>? public bool isUserDefined()
??? // クラスがユーザー定義クラスかどうかをテストします。 public bool isInstantiable()
???インスタンス化されました Passed
??? public bool hasConstant(string name)
??? // クラスに特定の定数があるかどうかをテストします
??? public bool hasMethod(string name)
? ?? //クラスに特定のメソッドがあるかどうかをテストします
??? public bool hasProperty(string name)
??? //クラスに特定のプロパティがあるかどうかをテストします
??? ()
??? // パス名を含むこのクラスを定義するファイル名を取得します。 public int getStartLine()
??? // このクラスを定義する開始行を取得します
??? public int getEndLine()
??? //このクラスを定義する終了行を取得します
??? public string getDocComment()
??? this class
??? public ReflectionMethod getConstructor()
??? //このクラスのコンストラクター情報を取得します
??? public ReflectionMethod getMethod(string name)
???このクラスの特定のメソッド Information
??? public ReflectionMethod[] getMethods()
??? //このクラスのすべてのメソッド情報を取得します
??? public ReflectionProperty getProperty(string name) >??? / / 特定のプロパティ情報を取得します
??? public ReflectionProperty[] getProperties()
??? //このクラスのすべてのプロパティ情報を取得します
???
??? //このクラスのすべての定数情報を取得します
??? public mixedConstant(string name)
??? // このクラスの特定の定数情報を取得します
??? ReflectionClass[] getInterfaces( )
??? // インターフェースのクラス情報を取得します
??? public bool isInterface()
??? // クラスがインターフェースであるかどうかをテストします
??? public bool isAbstract()
??? //クラスが抽象クラスかどうかをテストします
??? public bool isFinal()
??? //クラスがfinal
と宣言されているかどうかをテストします? ?? public int getModifiers( )
??? //このクラスの修飾子を取得します。戻り値の型はリソース型である可能性があります
??? //Reflection::getModifierNames($class- >getModifiers())
??? public bool isInstance(stdclass object)
??? //渡されたオブジェクトがこのクラスのインスタンスであるかどうかをテストします
??? * args)
? //このクラスのインスタンスを作成します
??? public ReflectionClass getParentClass()
??? //親クラスを取得します
??? ReflectionClass class)
??? //クラスに渡されたものがこのクラスの親クラスであるかどうかをテストします
??? public array getStaticProperties()
??? //クラスのすべての静的プロパティを取得します
??? publicmixedgetStaticPropertyValue(stringname[,mixeddefault])
???プライベートの場合はアクセスできません
??? (文字列名、混合値)
?? //このクラスの静的プロパティ値を設定します。これはカプセル化の原則に違反します。
???
??? //静的プロパティを除くこのクラスのプロパティ情報を取得します public bool isIterateable()
??? public boolimplementsInterface(string name)??? / /特定のインターフェイスが実装されているかどうかをテストします
??? public ReflectionExtension getExtension()
??? public string getExtensionName()
}
?>

⑥ReflectionMethod クラス:
class ReflectionMethod extends ReflectionFunction
{
??? public __construct(mixed class, string name)
??? public string __toString()
??? public static string export()
??? public invokemixed(stdclass object,mixed* args) )
??? //このメソッドを呼び出します
??? publicmixedinvokeArgs(stdclass object, array args)
??? //このメソッドを呼び出して複数のパラメータを渡します
??? bool isFinal()
??? //メソッドがfinalであるかどうかをテストします
??? public bool isAbstract()
??? //メソッドがabstractであるかどうかをテストします??? bool isPublic()
??? //メソッドがパブリックかどうかをテストします
??? public bool isPrivate()
??? //メソッドがプライベートかどうかをテストします
??? bool isProtected()
??? //メソッドが保護されているかどうかをテストします
??? public bool isStatic()
??? //メソッドが静的かどうかをテストします
??? bool isConstructor()
??? //メソッドがコンストラクター
かどうかをテストします public bool isDestructor()
??? //メソッドがデストラクターかどうかをテストします? ? public int getModifiers()
??? // メソッドの修飾子を取得します
??? public ReflectionClass getDeclaringClass()
??? // メソッドが属するクラスを取得します?? // ReflectionFunction
???から継承 public string getName()
??? public bool isInternal()
??? ( )
??? public string getFileName()
??? public int getEndLine()
? ? public 配列 getStaticVariables()
??? public bool returnsReference()
??? public int getNumberOfParameters() getNumberOfRequiredParameters ()
}
?>

⑦ReflectionProperty クラス:
class ReflectionProperty は Reflector
{
???を実装します。 )
??? public __construct(mixed class, string name)
??? public string __toString()
??? // この属性をエクスポートします詳細情報
??? public string getName()
??? // 属性名を取得します。 public bool isPublic()
??? // 属性名がpublic
??? public bool isPrivate()
??? // プロパティ名が private
かどうかをテストします public bool isProtected()
??? // プロパティ名をテストしますprotected
??? public bool isStatic()
??? // 属性名が static
かどうかをテストします public bool isDefault()
??? )
??? // 修飾子を取得します
??? public mixedValue(stdclass object)
??? // 属性値を取得します
???混合値)
??? // 属性値を設定します
??? public ReflectionClass getDeclaringClass()
??? // 属性を定義するクラスを取得します
??? ( )
??? //この属性のアノテーションを取得します
}
?>

⑧ReflectionExtension class
class ReflectionExtensionimplements Reflector {
??? 最終プライベート __clone()
??? パブリック __construct(文字列名)
??? パブリック ストリング __toString()

??? >? ?? //拡張機能のすべての情報をエクスポートします
??? public string getName()
??? // 拡張機能の名前を取得します
??? 🎜>?? // 拡張機能のバージョンを取得します
??? public ReflectionFunction[] getFunctions()
??? // 拡張機能
のすべての関数を取得します)
?? //拡張子のすべての定数を取得します。 getINIEntries()
??? //php.ini 内の拡張子に関連するコマンド情報を取得します。 ??? public ReflectionClass[] getClasses()
??? public array getClassNames()
}
?>

4.添付ファイル:

実際、2 番目の API 概要からわかるように、インターフェイスは非常に使いやすいです。
一方で、Reflector インターフェースは、Reflection 小規模システムに適切なインターフェース命名規則を提供します。
この小規模システムの API は、外部から見ると、その仕様に従う必要があります。
一方、多くのクラスが Reflector インターフェースを実装しているため、
このようなクラス階層ではポリモーフィズムを実装するのが非常に簡単です。



デモ


コード


は次のとおりです。

class ClassOne {
function callClassOne() {
print "In Class One";
}
}
class ClassOneDelegator {
private $ターゲット;function __construct() {$this->target[] = new ClassOne();}function __call($name, $args) {foreach ($ this->target as $obj) {$r = new ReflectionClass($obj);
if ($method = $r->getMethod($name)) {
if ($method ->isPublic() && !$method->isAbstract()) {
return $method->invoke($obj, $args);
}
}
}
}
}
$obj = new ClassOneDelegator();
$obj->callClassOne();
?>


出力結果:
クラス 1
が表示され、 は、 を介して クラス ClassOneDelegator をプロキシすることで ClassOne クラスを置き換えます。 彼の メソッド を実装します。
同様に、次のコードも実行できます。

class ClassOne {
function callClassOne() {
print "In Class One";
}
}
class ClassOneDelegator {
private $ターゲット;
function addObject($obj) {
$this->target[] = $obj;
}
function __call($name, $args) {
foreach ($ this->target as $obj) {
$r = new ReflectionClass($obj);
if ($method = $r->getMethod($name)) {
if ($method ->isPublic() && !$method->isAbstract()) {
return $method->invoke($obj, $args);
}
}
}
}
}
$obj = new ClassOneDelegator();
$obj->addObject(new ClassOne());
$obj->callClassOne();
?> ;

PHPReflectionAPI -- Reflection テクノロジー

を使用して実装されたプラグイン システム アーキテクチャ


http://www.e897.com/Article/wlbc/php/200908/5377.html

???1. /**
???? 2. * @name????PHP リフレクション API -- リフレクション テクノロジを使用して実装されたプラグイン システム アーキテクチャ
??? 3. * @author :PHPCQ.COM
? ?? 4.*/????
???? 5. インターフェース Iplugin{????
???? 6.???????????????
?? 7. }????
???? 8. 関数 findPlugins(){????
???? ????$plugins = array();??????
??????10.??????????????? foreach (get_declared_classes() as $class) {??????
????11.????????????????????????$reflectionClass = new ReflectionClass($class) ;??????
???12.???????????????????????? if ($reflectionClass-> ;implementsInterface('Iplugin')) {??????
???13.?????????????????? ????????????????$plugins[] = $reflectionClass;??????
??????14。 ???????????????????}????
???15.????????? ?}????
???16.???????????????$plugins を返します;????
???17. ???
????18. 関数 computeMenu(){????
????19.???????????????$menu = 配列();??????
????20.??????????????? foreach (findPlugins() as $plugin){??????
? ???21.??????????????????????????????if ( $plugin->hasMethod('getMenuItems')) { ????
???22.????????????????????? ??????????$reflectionMethod = $plugin->getMethod('getMenuItems');??????
???? 23。 ?????????????????????????????????? if ($reflectionMethod->isStatic()) { ????
???24.????????????????????? ?????????????????????????$items = $reflectionMethod->invoke(null );??????
??? 25.?????????????????????????????? else {??????
???26.????????????????????? ???????????????????????????????$pluginInstance = $plugin-> ;newInstance();??????
????27.??????????????????????????? ????????????????$items = $reflectionMethod->invoke($pluginInstance);??????
???28.????????? ??????????????????????????????????
??? ?29.????????????????????????????????????$menu = array_merge ($menu,$items);??????
???30.?????? ??????????????????? ????}????
???31.???????????????
???32.??? ?????????? return $menu;????
???34. 関数 computeArticles() ??
???35.??????????????? $articles = array();??????
????36.??? ?????????? foreach (findPlugins() as $plugin){??? ?
??????37.???????????? ????????????????if ($plugin->hasMethod ('getArticles')) {??????
????38.?????? ?????????????????????? $reflectionMethod = $plugin->getMethod(' getArticles');????
????39.???? ?????????????????????? ???????????????????if ($reflectionMethod->isStatic()) {??????
????40.?????? ???????????????????????????????????????? ???????$items = $reflectionMethod->invoke(null);????
??????41.??????????????? ???????????????????????????? } else {??????
???42.?????? ???????????????????????????????????????? ???????$pluginInstance = $plugin->newInstance();? ???
??????43.??????????????? ????????????????????????????????????????$items = $reflectionMethod- >invoke($pluginInstance);??????
??? ?44.??????????????????????????? ????????????????????}???
???45​​.??????????????? ?????????????????????????$articles = array_merge($articles,$items);??????
????46 .?????????????????????????????????}???
???47.??? ????????????? }??????
???48.??????????????? $articles;??? ?
????49. }??
????50.require_once('plugin.php');??????
???51. ();????
??? ?52. $articles????= computeArticles();????
???53.
????54. print_r($articles );????
???55.????
????56.????
?? ??57. //plugin.php コードは次のとおりです??
???58.
???59. クラス MycoolPugin は Iplugin {?? ??
???60.???? パブリック静的関数 getName(){????
??????61.??? ???????????????????????????? 'MycoolPlugin' を返します;??????
???62.??? ????????????????????
???63.??????????????? public static function getMenuItems(){??????
??????64.??????????????????????????? ?? return array(array('description'=>'MycoolPlugin','link'=>'/MyCoolPlugin'));????
????65.????????? ??????? }??????
??????66.?????????????????? public static function getArticles(){??????
??????67.??????????????????????????? ?? return array(array('path'=>'/MycoolPlugin','title'=>'これは本当に素晴らしい記事です','text'=>xxxxxxxxx));????
?? ??68.??????????????? }??????
??????69。 }



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