PHP には、クラス、インターフェイス、関数、メソッド、拡張機能をリバース エンジニアリングできる完全なリフレクション API があります。リフレクション API は、関数、クラス、メソッド内のドキュメント コメントを抽出するメソッドを提供します。この記事では、PHP リフレクション API を使用してクラス情報を取得し、完全なデモ コードを提供する方法を紹介します。
PHP リフレクション API ドキュメントのアドレス: http://php.net/manual/zh/class.reflectionclass.php
$ref = new ReflectionClass($classname);echo $ref->getName();echo $ref->getFileName();
$ref = new ReflectionClass($classname);$properties = $ref->getProperties();foreach($properties as $property){ echo $property->getName(); }
$ref = new ReflectionClass($classname);$methods = $ref->getMethods();foreach($methods as $method){ echo $method->getName(); }
$ref = new ReflectionClass($classname);$interfaces = $ref->getInterfaces();foreach($interfaces as $interface){ echo $interface->getName(); }
User.class.php
<?php/** 用户接口 */interface IUser{ // 新增用户 public function add($data); // 读取用户数据 public function get($id); }/** 用户类 */class User implements IUser{ /** * 用户数据 */ protected $user = array(); /** * 新增用户 * @param Array $data 用户数据 * @return Int */ public function add($data){ $this->user[] = $data; $keys = array_keys($this->user); return end($keys); } /** * 读取用户数据 * @param Int $id 用户id * @return Array */ public function get($id){ if(isset($this->user[$id])){ return $this->user[$id]; }else{ return array(); } } }/** VIP用户类 */class Vip extends User{ /** * 读取vip用户数据 * @param Int $id 用户id * @return Array */ public function getvip($id){ $data = $this->get($id); if($data){ return $this->format($data); } return $data; } /** * 修饰数据 * @param Array $data 用户数据 * @return Array */ private function format($data){ $data['is_vip'] = 1; return $data; } } ?>Ref クラスを作成し、PHP リフレクション クラスを呼び出してクラス情報を取得します
##Ref.class .php<?php/**
* 调用PHP反射类获取类信息
* Date: 2017-05-24
* Author: fdipzone
* Ver: 1.0
*
* Func
* public static setClass 设置反射类
* public static getBase 读取类基本信息
* public static getInterfaces 读取类接口
* public static getProperties 读取类属性
* public static getMethods 读取类方法
*/class Ref{
private static $refclass = null; // 设置反射类
public static function setClass($classname){
self::$refclass = new ReflectionClass($classname);
} // 读取类基本信息
public static function getBase(){
echo '<strong>BASE INFO</strong>'.PHP_EOL; echo 'class name: '.self::$refclass->getName().PHP_EOL; echo 'class path: '.dirname(self::$refclass->getFileName()).PHP_EOL; echo 'class filename: '.basename(self::$refclass->getFileName()).PHP_EOL.PHP_EOL;
} // 读取类接口
public static function getInterfaces(){
echo '<strong>INTERFACES INFO</strong>'.PHP_EOL; $interfaces = self::$refclass->getInterfaces(); if($interfaces){ foreach($interfaces as $interface){ echo 'interface name: '.$interface->getName().PHP_EOL;
}
}
} // 读取类属性
public static function getProperties(){
echo '<strong>PROPERTIES INFO</strong>'.PHP_EOL; $properties = self::$refclass->getProperties(); if($properties){ foreach($properties as $property){ echo 'property name: '.$property->getName().PHP_EOL; echo 'property modifier: '.self::getModifier($property).PHP_EOL; echo 'property comments: '.self::formatComment($property->getDocComment()).PHP_EOL.PHP_EOL;
}
}
} // 读取类方法
public static function getMethods(){
echo '<strong>METHODS INFO</strong>'.PHP_EOL; $methods = self::$refclass->getMethods(); if($methods){ foreach($methods as $method){ echo 'method name: '.$method->getName().PHP_EOL; echo 'method modifier: '.self::getModifier($method).PHP_EOL; echo 'method params num: '.$method->getNumberOfParameters().PHP_EOL; $params = $method->getParameters(); if($params){ foreach($params as $param){ echo 'param name:'.$param->getName().PHP_EOL;
}
} echo 'method comments: '.self::formatComment($method->getDocComment()).PHP_EOL.PHP_EOL;
}
}
} // 获取修饰符
private static function getModifier($o){
// public
if($o->isPublic()){ return 'public';
} // protected
if($o->isProtected()){ return 'protected';
} // private
if($o->isPrivate()){ return 'private';
} return '';
} // 格式化注释内容
private static function formatComment($comment){
$doc = explode(PHP_EOL, $comment); return isset($doc[1])? trim(str_replace('*','',$doc[1])) : '';
}
}?>
demo:
<?phprequire 'Ref.class.php';require 'User.class.php'; echo '<pre class="brush:php;toolbar:false">'; Ref::setClass('Vip'); Ref::getBase(); Ref::getProperties(); Ref::getMethods(); Ref::getInterfaces(); echo '';?>
BASE INFOclass name: Vipclass path: /home/fdipzone/refclass filename: User.class.php PROPERTIES INFOproperty name: userproperty modifier: protectedproperty comments: 用户数据 METHODS INFOmethod name: getvipmethod modifier: publicmethod params num: 1param name:idmethod comments: 读取vip用户数据method name: formatmethod modifier: privatemethod params num: 1param name:datamethod comments: 修饰数据method name: addmethod modifier: publicmethod params num: 1param name:datamethod comments: 新增用户method name: getmethod modifier: publicmethod params num: 1param name:idmethod comments: 读取用户数据 INTERFACES INFOinterface name: IUser
関連する推奨事項:
mysql のクエリ時にパフォーマンスに影響を与える過剰なオフセットの理由と最適化方法の詳細な説明通常のルールの使用についてPHP での幅と高さのスタイルを削除する方法ファイル コンテンツの重複排除と並べ替えの詳細な説明以上がphpを使用してクラス情報を取得するAPIを反映する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。