この記事では、主に PHP リフレクション メカニズムの原理と使用法を紹介し、PHP リフレクション メカニズムの原理、使用法、および関連する注意事項を例の形式で分析します。必要な友人は参考にしてください。この記事の例では、原理を説明します。 PHP リフレクション メカニズムの使用。参考のために皆さんと共有してください。詳細は次のとおりです:
リフレクションオブジェクト指向プログラミングでは、オブジェクトに内省する機能が与えられ、この内省プロセスがリフレクションです。
熟考、直感的な理解は、到着場所に基づいて出発点とソースを見つけることです。たとえば、裸のオブジェクトの場合、そのオブジェクトが属するクラスと、そのオブジェクトがどのようなメソッドを持っているかを、このオブジェクトを通じて知ることができます。
リフレクションとは、PHP の実行状態で PHP プログラムの分析を拡張し、クラス、メソッド、プロパティ、パラメーターなどに関するコメントを含む詳細情報をエクスポートまたは提案することを指します。この動的に情報を取得し、オブジェクトのメソッドを動的に呼び出す機能をリフレクションAPIと呼びます。
リフレクションAPIの使い方<?php class person{ public $name; public $gender; public function say(){ echo $this->name," \tis ",$this->gender,"\r\n"; } public function set($name, $value) { echo "Setting $name to $value \r\n"; $this->$name= $value; } public function get($name) { if(!isset($this->$name)){ echo '未设置'; $this->$name="正在为你设置默认值"; } return $this->$name; } } $student=new person(); $student->name='Tom'; $student->gender='male'; $student->age=24;
さて、この生徒オブジェクトのメソッドと属性リストを取得するにはどうすればよいでしょうか?次のコードに示すように:
// 获取对象属性列表 $reflect = new ReflectionObject($student); $props = $reflect->getProperties(); foreach ($props as $prop) { print $prop->getName() ."\n"; } // 获取对象方法列表 $m=$reflect->getMethods(); foreach ($m as $prop) { print $prop->getName() ."\n"; }
リフレクション API を使用せずにクラス関数を使用して、オブジェクトのプロパティと詳細情報の連想配列を返すこともできます:
// 返回对象属性的关联数组 var_dump(get_object_vars($student)); // 类属性 var_dump(get_class_vars(get_class($student))); // 返回由类的方法名组成的数组 var_dump(get_class_methods(get_class($student)));
このオブジェクトが他のオブジェクトから渡された場合ページ ここに来て、それがどのカテゴリに属しているかどうやってわかりますか?たった 1 行のコードでそれを実行できます:
// 获取对象属性列表所属的类 echo get_class($student);
リフレクション API の機能は明らかにより強力で、メソッドのアクセス許可などを含むこのクラスのプロトタイプを復元することもできます。 . など:
// 反射获取类的原型 $obj = new ReflectionClass('person'); $className = $obj->getName(); $Methods = $Properties = array(); foreach($obj->getProperties() as $v) { $Properties[$v->getName()] = $v; } foreach($obj->getMethods() as $v) { $Methods[$v->getName()] = $v; } echo "class {$className}\n{\n"; is_array($Properties)&&ksort($Properties); foreach($Properties as $k => $v) { echo "\t"; echo $v->isPublic() ? ' public' : '',$v->isPrivate() ? ' private' : '', $v->isProtected() ? ' protected' : '', $v->isStatic() ? ' static' : ''; echo "\t{$k}\n"; } echo "\n"; if(is_array($Methods)) ksort($Methods); foreach($Methods as $k => $v) { echo "\tfunction {$k}(){}\n"; } echo "}\n";
出力は次のとおりです:
class person { public gender public name function get(){} function set(){} function say(){} }
それだけでなく、PHP マニュアルには数十のリフレクション API が記載されており、リフレクションはプロトタイプを完全に記述していると言えます。クラスまたはオブジェクトの。リフレクションはクラスやオブジェクトだけでなく、関数、拡張モジュール、例外などにも使用できます。
リフレクションは何をしますか?リフレクションはドキュメントの生成に使用できます。したがって、これを使用してファイル内のクラスをスキャンし、説明ドキュメントを 1 つずつ生成できます。
リフレクションはクラスの内部構造を検出できるので、プラグイン関数を実装するためのフックとして使用できますか?それとも動的プロキシですか?
例:
<?php class mysql { function connect($db) { echo "连接到数据库${db[0]}\r\n"; } } class sqlproxy { private $target; function construct($tar) { $this->target[] = new $tar(); } function call($name, $args) { foreach ($this->target as $obj) { $r = new ReflectionClass($obj); if ($method = $r->getMethod($name)) { if ($method->isPublic() && !$method->isAbstract()) { echo "方法前拦截记录LOG\r\n"; $method->invoke($obj, $args); echo "方法后拦截\r\n"; } } } } } $obj = new sqlproxy('mysql'); $obj->connect('member');
通常の開発では、リフレクションが使用される場所はそれほど多くありません。1 つはオブジェクトのデバッグで、もう 1 つはクラス情報の取得です。 MVC およびプラグインの開発では、リフレクションの使用が非常に一般的ですが、リフレクションは非常に高価でもあり、代替手段が見つかった場合は乱用しないでください。
PHP には Token 関数があり、このメカニズムを通じていくつかのリフレクション関数を実装できます。シンプルさと柔軟性の観点から、提供されているリフレクション API を使用することをお勧めします。
多くの場合、リフレクションを上手に利用すると、コードをエレガントで簡潔に保つことができますが、リフレクションによってクラスのカプセル化が破壊される可能性もあります。これは、リフレクションによって、公開されるべきではないメソッドやプロパティが強制的に公開されるためです。これは両方の利点です。そしてデメリット。
以上がこの記事の全内容です、皆様の学習のお役に立てれば幸いです。
関連する推奨事項:
Reflection機能と使い方
Reflectionの詳細な説明メカニズムの例
リフレクション依存性注入の実装詳細手順の説明
以上がPHPのリフレクション機構の原理と使い方を画像と文章で詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。