前回の記事「手書きPHP APIフレームワーク:Composerのインストールと使い方(2)」ではComposerのインストールと使い方を紹介しましたが、今回はリフレクションの概念について紹介します。
熟考、直観的理解とは、到着地に基づいて出発地と発信源を見つけることです。リフレクションとは、PHP の実行状態で PHP プログラムの分析を拡張し、クラス、メソッド、プロパティ、パラメーターなどに関するコメントを含む詳細情報をエクスポートまたは提案することを指します。この動的に情報を取得し、オブジェクトのメソッドを動的に呼び出す機能をリフレクションAPIと呼びます。
まずデモを見てみましょう:
<?php function p($msg, $var) { echo($msg.":".print_r($var, true)).PHP_EOL.PHP_EOL; } class Demo { private $id; protected $name; public $skills = []; public function __construct($id, $name, $skills = []) { $this->id = $id; $this->name = $name; $this->skills = $skills; } public function getName() { return $this->name; } public function getSkill() { p('skill', $this->skills); } } $ref = new ReflectionClass('Demo'); if ($ref->isInstantiable()) { p('检查类是否可实例化isInstantiable', null); } $constructor = $ref->getConstructor(); p('获取构造函数getConstructor', $constructor); $parameters = $constructor->getParameters(); foreach ($parameters as $param) { p('获取参数getParameters', $param); } if ($ref->hasProperty('name')) { $attr = $ref->getProperty('name'); p('获取属性getProperty', $attr); } $attributes = $ref->getProperties(); foreach ($attributes as $row) { p('获取属性列表getProperties', $row->getName()); } if ($ref->hasMethod('getSkill')) { $method = $ref->getMethod('getSkill'); p('获取方法getMethod', $method); } $methods = $ref->getMethods(); foreach ($methods as $row) { p('获取方法列表getMethods', $row->getName()); } $instance = $ref->newInstanceArgs([1, 'sai', ['php', 'js']]); p('newInstanceArgs', $instance);
出力:
➜ php git:(main) php reflect.php 检查类是否可实例化isInstantiable: 获取构造函数getConstructor:ReflectionMethod Object ( [name] => __construct [class] => Demo ) 获取参数getParameters:ReflectionParameter Object ( [name] => id ) 获取参数getParameters:ReflectionParameter Object ( [name] => name ) 获取参数getParameters:ReflectionParameter Object ( [name] => skills ) 获取属性getProperty:ReflectionProperty Object ( [name] => name [class] => Demo ) 获取属性列表getProperties:id 获取属性列表getProperties:name 获取属性列表getProperties:skills 获取方法getMethod:ReflectionMethod Object ( [name] => getSkill [class] => Demo ) 获取方法列表getMethods:__construct 获取方法列表getMethods:getName 获取方法列表getMethods:getSkill newInstanceArgs:Demo Object ( [id:Demo:private] => 1 [name:protected] => sai [skills] => Array ( [0] => php [1] => js ) )
デモでは ReflectionClass クラスが使用されています。もちろん、ReflectionClass クラスはこれらの方法に限定されません。
その他のメソッド
ReflectionClass クラスにはさらに多くのメソッドがあります:
説明 | |
---|---|
ReflectionClass クラスを初期化する | |
クラスのエクスポート | |
定義の取得定数 | |
定数のセットを取得 | #ReflectionClass::getConstructor |
ReflectionClass::getDefaultProperties | |
ReflectionClass::getDocComment | |
ReflectionClass::getEndLine | |
ReflectionClass::getExtension | |
ReflectionClass::getExtensionName | |
ReflectionClass::getFileName | |
ReflectionClass: :getInterfaceNames | |
ReflectionClass::getInterfaces | |
ReflectionClass:: getMethod | |
ReflectionClass::getMethods | |
ReflectionClass::getModifiers | |
ReflectionClass::getName | |
#ReflectionClass::getNamespaceName | |
ReflectionClass::getParentClass | |
ReflectionClass::getProperties | |
ReflectionClass::getProperty | |
ReflectionClass::getReflectionConstant | |
ReflectionClass::getReflectionConstants | |
ReflectionClass::getShortName | |
ReflectionClass::getStartLine | |
ReflectionClass::getStaticProperties | |
##ReflectionClass::getStaticPropertyValue | |
ReflectionClass::getTraitAliases | |
ReflectionClass::getTraitNames | |
ReflectionClass::getTraits | |
ReflectionClass::hasConstant | |
ReflectionClass::hasMethod | |
#ReflectionClass::hasProperty | |
##ReflectionClass::implementsInterface | インターフェースの実装 |
ReflectionClass::inNamespace | 名前空間にあるかどうかを確認します |
##ReflectionClass:: isAbstract | クラスが抽象クラスかどうかを確認します。 Class (abstract) |
ReflectionClass::isAnonymous | クラスが匿名クラスかどうかを確認します |
クラスがコピーできるかどうかを返します | |
クラスはfinalと宣言されています | |
クラスのインスタンスを確認してください | ##ReflectionClass::isInstantiable |
ReflectionClass::isInterface | |
ReflectionClass::isInternal | |
ReflectionClass::isIterable | |
ReflectionClass::isIterateable | |
ReflectionClass::isSubclassOf | |
ReflectionClass::isTrait | |
ReflectionClass::isUserDefined | |
ReflectionClass::newInstance | |
##ReflectionClass::newInstanceArgs | 指定されたパラメーターから新しいクラス インスタンスを作成します。 |
ReflectionClass::newInstanceWithoutConstructor | コンストラクターを呼び出さずに新しいクラス インスタンスを作成します |
ReflectionClass:: setStaticPropertyValue | 静的プロパティの値を設定します |
ReflectionClass::__toString | ReflectionClass オブジェクトの文字列表現を返します。 |
以上が手書きPHP APIフレームワークのリフレクション入門(3)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。