この記事では主にサンプル紹介PHPのReflectionリフレクションの仕組みを紹介します。Reflectionを使ってクラスに関する情報を取得するという観点から紹介します
PHP5では次のような新しい関数が追加されました。反射。この機能を使用すると、プログラマはクラス、インターフェイス、関数、メソッド、拡張機能をリバース エンジニアリングできます。PHP コード を通じて、オブジェクトのすべての情報を取得し、オブジェクトと対話することができます。 クラス person があるとします。
class Person { /** * For the sake of demonstration, we"re setting this private */ private $_allowDynamicAttributes = false; /** type=primary_autoincrement */ protected $id = 0; /** type=varchar length=255 null */ protected $name; /** type=text null */ protected $biography; public function getId() { return $this->id; } public function setId($v) { $this->id = $v; } public function getName() { return $this->name; } public function setName($v) { $this->name = $v; } public function getBiography() { return $this->biography; } public function setBiography($v) { $this->biography = $v; } }ReflectionClass を通じて、次の情報を取得できます:
1. 定数の内容
2. プロパティの名前
3.
4. 静的プロパティ 静的プロパティ
5.
名前空間 名前空間6. Personクラスがfinalかabstractかどうか
コードは次のとおりです:
$class = new ReflectionClass('Person');属性 (プロパティ) を取得します: コードは次のとおりです:
$properties = $class->getProperties(); foreach ($properties as $property) { echo $property->getName()."\n"; } // 输出: // _allowDynamicAttributes // id // name // biographyデフォルトでは、ReflectionClass はプライベートおよび保護されたプロパティを含むすべてのプロパティを取得します。プライベート属性のみを取得したい場合は、追加のパラメーターを渡す必要があります:
$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);利用可能なパラメーターのリスト:
ReflectionProperty::IS_STATIC ReflectionProperty::IS_PUBLIC ReflectionProperty::IS_PROTECTED ReflectionProperty::IS_PRIVATEパブリック属性とプライベート属性の両方を同時に取得するには、次のように記述するだけです。 ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED
奇妙に感じることはないはずです。
コードは次のとおりです:
foreach($properties as $property) { if($property->isProtected()) { $docblock = $property->getDocComment(); preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches); echo $matches[1]."\n"; } } // Output: // primary_autoincrement // varchar // textちょっと信じられないですね。コメントも取得できます。
メソッドの取得: getMethods() を通じてクラスのすべてのメソッドを取得します。返されるのは、ReflectionMethod オブジェクトの配列です。これ以上のデモはありません。
最後に、ReflectionMethod を通じてクラス内のメソッドを呼び出します。
$data = array("id" => 1, "name" => "Chris", "biography" => "I am am a PHP developer"); foreach($data as $key => $value) { if(!$class->hasProperty($key)) { throw new Exception ($key." is not a valid property"); } if(!$class->hasMethod("get". ucfirst ($key))) { throw new Exception($key." is missing a getter"); } if(!$class->hasMethod("set".ucfirst($key))) { throw new Exception($key." is missing a setter"); } // Make a new object to interact with $object = new Person(); // Get the getter method and invoke it with the value in our data array $setter = $class->getMethod("set".ucfirst($key)); $ok = $setter->invoke($object, $value); // Get the setter method and invoke it $setter = $class->getMethod("get".ucfirst($key)); $objValue = $setter->invoke($object); // Now compare if($value == $objValue) { echo "Getter or Setter has modified the data.\n"; } else { echo "Getter and Setter does not modify the data.\n"; } }
以上がReflection リフレクション メカニズムは PHP でどのように実装されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。