この記事では、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には数十のリフレクション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 を使用することをお勧めします。
多くの場合、リフレクションを上手に利用すると、コードをエレガントで簡潔に保つことができますが、リフレクションによってクラスのカプセル化が破壊される可能性もあります。これは、リフレクションによって、公開されるべきではないメソッドやプロパティが強制的に公開されるためです。これは両方の利点です。そしてデメリット。
以上がPHPのリフレクションメカニズムの原理は何ですか?反射機構の機能を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。