PHP에는 클래스, 인터페이스, 함수, 메서드 및 확장을 리버스 엔지니어링할 수 있는 완전한 리플렉션 API가 있습니다. Reflection 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(); }
User.class.php$ref = new ReflectionClass($classname);$interfaces = $ref->getInterfaces();foreach($interfaces as $interface){ echo $interface->getName();
}
Ref.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;
}
}
?>
<?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])) : ''; } }?>
<?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 '';?>
관련 권장 사항:
mysql 쿼리 중 과도한 오프셋이 성능에 영향을 미치는 이유 및 최적화 방법에 대한 자세한 설명일반 PHP를 사용하여 너비 및 높이 스타일을 제거하는 방법에 대해파일 내용에 대한 자세한 설명 중복 제거 및 정렬 관련 콘텐츠위 내용은 클래스 정보를 얻기 위해 PHP를 사용하여 API를 반영하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!