php反射獲取類和方法中的註釋
通過php中的反射機制,獲取該類的文件註釋,再通過獲取其所有的方法,獲取方法的註釋
所用到的主要類及其方法
ReflectionClass ReflectionClass::getDocComment ReflectionClass::getMethods $method->getName() $method->getDocComment(); $method->isProtected(); $method->getParameters(); $param->getName(); $param->isDefaultValueAvailable(); $param->getDefaultValue()
測試類如下:
test.php
<?php header("Content-type: text/html; charset=utf-8"); require_once dir(__DIR__).'function.php'; require_once dir(__DIR__).'TestClass.php'; $class_name = 'TestClass'; $reflection = new ReflectionClass ( $class_name ); //通過反射獲取類的註釋 $doc = $reflection->getDocComment (); //解析類的註釋頭 $parase_result = DocParserFactory::getInstance()->parse ( $doc ); $class_metadata = $parase_result; //輸出測試 var_dump ( $doc ); echo "\r\n"; print_r( $parase_result ); echo "\r\n-----------------------------------\r\n"; //獲取類中的方法,設定獲取public,protected型別方法 $methods = $reflection->getMethods(ReflectionMethod::IS_PUBLIC + ReflectionMethod::IS_PROTECTED + ReflectionMethod::IS_PRIVATE); //遍歷所有的方法 foreach ($methods as $method) { //獲取方法的註釋 $doc = $method->getDocComment(); //解析註釋 $info = DocParserFactory::getInstance()->parse($doc); $metadata = $class_metadata + $info; //獲取方法的型別 $method_flag = $method->isProtected();//還可能是public,protected型別的 //獲取方法的引數 $params = $method->getParameters(); $position=0; //記錄引數的次序 foreach ($params as $param){ $arguments[$param->getName()] = $position; //引數是否設定了預設引數,如果設定了,則獲取其預設值 $defaults[$position] = $param->isDefaultValueAvailable() ? $param->getDefaultValue() : NULL; $position++; } $call = array( 'class_name'=>$class_name, 'method_name'=>$method->getName(), 'arguments'=>$arguments, 'defaults'=>$defaults, 'metadata'=>$metadata, 'method_flag'=>$method_flag ); print_r($call); echo "\r\n-----------------------------------\r\n"; }
function.php
<?php require_once dir(__DIR__).'DocParser.php'; /** * 解析doc * 下面的DocParserFactory是對其的進一步封裝,每次解析時,可以減少初始化DocParser的次數 * * @param $php_doc_comment * @return array */ function parse_doc($php_doc_comment) { $p = new DocParser (); return $p->parse ( $php_doc_comment ); } /** * Class DocParserFactory 解析doc * * @example * DocParserFactory::getInstance()->parse($doc); */ class DocParserFactory{ private static $p; private function DocParserFactory(){ } public static function getInstance(){ if(self::$p == null){ self::$p = new DocParser (); } return self::$p; } }
TestClass.php
<?php
/**
* A test class 在此處不能新增@ur,@param,@return 註釋
* 如果要將類的註釋和方法的註釋合併的話,添加了上面的註釋,會將方法中的註釋給覆蓋掉
*/
class TestClass {
/**
* @desc 獲取public方法
*
* @url GET pnrs
* @param array $request_data
* @return int id
*/
public function getPublicMethod($no_default,$add_time = '0000-00-00') {
echo "public";
}
/**
* @desc 獲取private方法
*
* @url GET private_test
* @return int id
*/
private function getPrivateMethod($no_default,$time = '0000-00-00') {
echo "private";
}
/**
* @desc 獲取protected方法
*
* @url GET protected_test
* @param $no_defalut,$time
* @return int id
*/
protected function getProtectedMethod($no_default,$time = '0000-00-00') {
echo "protected";
}
}
DocParser.php 該類源自一個開源專案
<?php
/**
* Parses the PHPDoc comments for metadata. Inspired by Documentor code base
* @category Framework
* @package restler
* @subpackage helper
* @author Murray Picton <[email protected]>
* @author R.Arul Kumaran <[email protected]>
* @copyright 2010 Luracast
* @license http://www.gnu.org/licenses/ GNU General Public License
* @link https://github.com/murraypicton/Doqumentor
*/
class DocParser {
private $params = array ();
function parse($doc = '') {
if ($doc == '') {
return $this->params;
}
// Get the comment
if (preg_match ( '#^/\*\*(.*)\*/#s', $doc, $comment ) === false)
return $this->params;
$comment = trim ( $comment [1] );
// Get all the lines and strip the * from the first character
if (preg_match_all ( '#^\s*\*(.*)#m', $comment, $lines ) === false)
return $this->params;
$this->parseLines ( $lines [1] );
return $this->params;
}
private function parseLines($lines) {
foreach ( $lines as $line ) {
$parsedLine = $this->parseLine ( $line ); // Parse the line
if ($parsedLine === false && ! isset ( $this->params ['description'] )) {
if (isset ( $desc )) {
// Store the first line in the short description
$this->params ['description'] = implode ( PHP_EOL, $desc );
}
$desc = array ();
} elseif ($parsedLine !== false) {
$desc [] = $parsedLine; // Store the line in the long description
}
}
$desc = implode ( ' ', $desc );
if (! empty ( $desc ))
$this->params ['long_description'] = $desc;
}
private function parseLine($line) {
// trim the whitespace from the line
$line = trim ( $line );
if (empty ( $line ))
return false; // Empty line
if (strpos ( $line, '@' ) === 0) {
if (strpos ( $line, ' ' ) > 0) {
// Get the parameter name
$param = substr ( $line, 1, strpos ( $line, ' ' ) - 1 );
$value = substr ( $line, strlen ( $param ) + 2 ); // Get the value
} else {
$param = substr ( $line, 1 );
$value = '';
}
// Parse the line and return false if the parameter is valid
if ($this->setParam ( $param, $value ))
return false;
}
return $line;
}
private function setParam($param, $value) {
if ($param == 'param' || $param == 'return')
$value = $this->formatParamOrReturn ( $value );
if ($param == 'class')
list ( $param, $value ) = $this->formatClass ( $value );
if (empty ( $this->params [$param] )) {
$this->params [$param] = $value;
} else if ($param == 'param') {
$arr = array (
$this->params [$param],
$value
);
$this->params [$param] = $arr;
} else {
$this->params [$param] = $value + $this->params [$param];
}
return true;
}
private function formatClass($value) {
$r = preg_split ( "[\(|\)]", $value );
if (is_array ( $r )) {
$param = $r [0];
parse_str ( $r [1], $value );
foreach ( $value as $key => $val ) {
$val = explode ( ',', $val );
if (count ( $val ) > 1)
$value [$key] = $val;
}
} else {
$param = 'Unknown';
}
return array (
$param,
$value
);
}
private function formatParamOrReturn($string) {
$pos = strpos ( $string, ' ' );
$type = substr ( $string, 0, $pos );
return '(' . $type . ')' . substr ( $string, $pos + 1 );
}
}
相關推薦
php反射獲取類和方法中的註釋
通過php中的反射機制,獲取該類的文件註釋,再通過獲取其所有的方法,獲取方法的註釋 所用到的主要類及其方法 ReflectionClass ReflectionClass::getDocComment ReflectionClass::getMethods $meth
final在類和方法中的使用
str package ring extend 方法 修飾 ati class int package final0; //final修飾的類不能繼承//final修飾的方法不能繼承public class TestFinal3 { public static void m
Java 自定義註解&通過反射獲取類、方法、屬性上的註解
反射 JAVA中的反射是執行中的程式檢查自己和軟體執行環境的能力,它可以根據它發現的進行改變。通俗的講就是反射可以在執行時根據指定的類名獲得類的資訊。 註解的定義 註解通過 @interface 關鍵字進行定義。 /** * 自定義註解 *
tkinter類和方法中的標籤佈局
說明: 此處主要解決在類中各個方法不同標籤之間的統一佈局問題 在程式碼中有備註的步驟為重點和關鍵步驟 程式碼如下: import tkinter as tk from PIL import Image,ImageTk class buju(): def
Python類和方法中的self
剛開始進入Python的面向物件階段的學習。發現在給類寫方法時必須加上self引數,而方法(函式)塊中的變數(物件)名前有時加了self,有時沒加,常常被此示例程式弄得一頭霧水,於是老實回頭補課。網上關於這個self的解釋、詳解、深入剖析之類的文章數不勝數,可是要麼太簡,要麼
手寫spring二:Java反射獲取類和物件資訊全解析
反射在這裡的作用就是知道全路徑 在框架啟動的時候把類例項化 然後設定到@service 和@Autowired裡面 所以要了解這東西怎麼用的 1. 什麼是類物件 類物件,就是用於描述這種類,都有什麼屬性,什麼方法的 2. 獲取類物件 獲取類物件有3種方式 (1). Class.f
Java反射獲取類和物件資訊全解析
反射可以解決在編譯時無法預知物件和類是屬於那個類的,要根據程式執行時的資訊才能知道該物件和類的資訊的問題。 在兩個人協作開發時,你只要知道對方的類名就可以進行初步的開發了。 獲取類物件 Class.forName(String clazzName)靜
利用反射獲取類或者方法或者欄位上的註解的值
從JDK1.5之後,註解在各大框架上得到了廣泛的應用。下面這個例子中,你可以判斷一個類或者方法或者欄位上有沒有註解,以及怎麼獲取上面的註解值。話不多說,程式碼如下: AnnotationTest01.java package com.zkn.newlearn.annota
Eclipse設定類和方法的註釋模板
一.開啟設定模板的視窗:Window->Preference->Java->Code Style->Code Template展開Comments,最常用的就是類和方法的註釋,我
Java 使用反射獲取類、方法、屬性上的註解
有的時候我們想使用反射獲取某個類的註解、方法上的註解、屬性上的註解。 下面是一個簡單的例子。裡面包括了上面提到的三個點。 01.package com.mine.practice.reflectfield; 02. 03.import java.lang.anno
C#通過反射獲取類中的方法和參數個數,反射調用方法帶參數
new [] 反射 電腦 ram col sta body create using System; using System.Reflection; namespace ConsoleApp2 { class Program { sta
C#通過反射獲取類中的方法和引數個數,反射呼叫方法帶引數
using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(string[] args)
[反射初探]根據反射獲取類中引數型別及引數名和引數值
public String getMyDeclaredMethods(T t) { Class<?> c = t.getClass(); Method m[] = c.getDeclaredMethods(); String text = "";
PHP中獲取類、方法、屬性
__CLASS__ 獲取當前類名,區分大小寫 __FUNCTION__ 當前函式名,區分大小寫 __METHOD__ 當前方法名,區分大小寫 get_class(obj);//取得當前語句所在類的
java反射呼叫指定jar包中的類和方法
需求:動態載入jar包,例項化jar包中的類,並呼叫類中的方法 已知:jar包所在路徑和jar包名稱,類名已知,類繼承的抽象類可以被引入,類中的方法已知 實現方法: 1. 手動呼叫類載入器動態載入jar包; 2. 應用java中的反射例項化類,得到類的一個例項; 3. 運
Interllij IDEA 註釋模板(類和方法)
生成 eight 否則 return pla mage clas templates rip 類上的註釋: file->setting->Editor->Filr and Code Templates->Includes->File Hea
通過反射獲取class文件中的構造方法,運行構造方法
對象 rgs span for instance .... urn his col /* * 通過反射獲取class文件中的構造方法,運行構造方法 * 運行構造方法,創建對象 * 1、獲取class文件對象 * 2、從class文件對象中,獲取需要
背水一戰 Windows 10 (76) - 控件(控件基類): Control - 基礎知識, 焦點相關, 運行時獲取 ControlTemplate 和 DataTemplate 中的元素
normal 焦點 colors 指針 是否 樣式 Go 系統 rgs 原文:背水一戰 Windows 10 (76) - 控件(控件基類): Control - 基礎知識, 焦點相關, 運行時獲取 ControlTemplate 和 DataTemplate 中的元素[源
反射獲取類中的指定字段
int tde rgs 修改 pub print tac forname cep ** Class.getField(String)方法可以獲取類中的指定字段(可見的), 如果是私有的可以用getDeclaedField("name")方法獲取,通過s
原 .NET/C# 反射的的效能資料,以及高效能開發建議(反射獲取 Attribute 和反射呼叫方法)
大家都說反射耗效能,但是到底有多耗效能,哪些反射方法更耗效能;這些問題卻沒有統一的描述。 本文將用資料說明反射各個方法和替代方法的效能差異,並提供一些反射程式碼的編寫建議。為了解決反射的效能問題,你可以遵循本文采用的各種方案。 本文內容 反射各方法的效能資料 反射的高效能開發建議