PHP の Reflection リフレクション メカニズムと例の紹介、phpreflection
PHP5 には新しい機能、リフレクションが追加されています。この機能を使用すると、プログラマはクラス、インターフェイス、関数、メソッド、拡張機能をリバース エンジニアリングできます。 PHP コードを通じて、オブジェクトのすべての情報を取得し、オブジェクトと対話できます。
クラス パーソン があるとします:
コードをコピーします コードは次のとおりです:
クラス人 {
/**
* デモンストレーションのために、これを非公開に設定します
*/
プライベート $_allowDynamicAttributes = false;
/**type=primary_autoincrement*/
保護された $id = 0;
/**タイプ=varchar 長さ=255 null*/
保護された $name;
/**type=text null*/
保護された $biography;
パブリック関数 getId()
{
return $this->id;
}
パブリック関数 setId($v)
{
$this->id = $v;
}
パブリック関数 getName()
{
return $this->name;
}
パブリック関数 setName($v)
{
$this->name = $v;
}
パブリック関数 getBiography()
{
return $this->biography;
}
パブリック関数 setBiography($v)
{
$this->略歴 = $v;
}
}
ReflectionClass を通じて、Person クラスの次の情報を取得できます:
1. 定数
2.プロパティのプロパティ名
3. メソッドメソッド名
4. 静的プロパティ
5. 名前空間
6. Personクラスがfinalかabstractか
クラス名「person」を ReflectionClass に渡すだけです:
コードをコピーします コードは次のとおりです:
$class = new ReflectionClass('人');
プロパティの取得 (プロパティ):
コードをコピーします コードは次のとおりです:
$properties = $class->getProperties();
foreach($properties as $property) {
echo $property->getName()."n";
}
// 出力:
// _allowDynamicAttributes
//ID
// 名前
// 略歴
デフォルトでは、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
奇妙に感じるべきではありません。
プロパティ名は $property->getName() を通じて取得でき、プロパティに書き込まれたコメントは getDocComment を通じて取得できます。
コードをコピーします コードは次のとおりです:
foreach($properties as $property) {
If($property->isProtected()) {
$docblock = $property->getDocComment();
Preg_match('/ type=([a-z_]*) /', $property->getDocComment(), $matches);
echo $matches[1]."n";
}
}
// 出力:
// プライマリ_オートインクリメント
//varchar
// テキスト
それはちょっと信じられないですね。コメントも取得できます。
メソッドの取得: getMethods() を通じてクラスのすべてのメソッドを取得します。返されるのは、ReflectionMethod オブジェクトの配列です。これ以上のデモはありません。
最後に、クラス内のメソッドが ReflectionMethod を通じて呼び出されます。
コードをコピーします コードは次のとおりです:
$data = array("id" => 1, "name" => "Chris", "biography" => "私は PHP 開発者です");
foreach($data as $key => $value) {
If(!$class->hasProperty($key)) {
throw new Exception($key." は有効なプロパティではありません");
}
If(!$class->hasMethod("get".ucfirst($key))) {
throw new Exception($key." にはゲッターがありません");
}
If(!$class->hasMethod("set".ucfirst($key))) {
throw new Exception($key." にはセッターがありません");
}
// 対話する新しいオブジェクトを作成します
$object = 新しい人();
// ゲッター メソッドを取得し、データ配列の値を使用して呼び出します
$setter = $class->getMethod("set".ucfirst($key));
$ok = $setter->invoke($object, $value);
// セッターメソッドを取得して呼び出します
$setter = $class->getMethod("get".ucfirst($key));
$objValue = $setter->invoke($object);
// それでは比較してみましょう
If($value == $objValue) {
echo "Getter または Setter がデータを変更しました。n";
} その他 {
echo "Getter と Setter はデータを変更しません。n";
}
}
ちょっと面白いですね。
またスコアの逆転が始まりましたが、面白いですか?
マッピングとも言えます。率直に言うと、オブジェクトのクローンを作成できるだけでなく、変数やオブジェクトのメソッドを呼び出すこともでき、非常に強力です。 PHP API5 には、
java の説明と似た説明がありますので、機会があれば参照してください。もちろん、この機能は php と asp の間に大きな違いがあることを証明するのに十分です。
http://www.bkjia.com/PHPjc/858748.html
www.bkjia.com本当http://www.bkjia.com/PHPjc/858748.html技術記事例では、PHP の Reflection リフレクション メカニズムを紹介します。 PHP5 には、Reflection という新しい機能が追加されています。この機能により、プログラマはクラス、インターフェイス、関数などをリバース エンジニアリングできます