PHP反射使用實(shí)例和PHP反射API的中文說明
最近在開發(fā)過程中需要獲取某個(gè)類方法的參數(shù)數(shù)量、名稱及參數(shù)順序,好根據(jù)參數(shù)的名稱來從$_GET里取值。
如方法原型為test($uid,$score), 那么我就知道需要需要從$_GET取
$uid = $_GET['uid'];
$score = $_GET['score'];
然后調(diào)用方法$obj->test($uid,$score)
當(dāng)然前提是約定好了參數(shù)名稱和get方法傳值變量名一致。
采用PHP的反射API,獲得函數(shù)參數(shù)名稱和參數(shù)默認(rèn)值的方法如下:
<?php
class testClass{
public function testFunc($param1,$param2=0){
}
}
$method = new ReflectionMethod('testClass', 'testFunc');
$params = $method--->getParameters();
foreach ($params as $param) {
echo 'param name: ' . $param->getName(),"\n";
if ($param->isOptional()) {
echo 'Default value: ' . $param->getDefaultValue(),"\n";
}
}
下面是PHP反射API的介紹:
1、用途:
該擴(kuò)展分析php程序,導(dǎo)出或提取出關(guān)于類、方法、屬性、參數(shù)等的詳細(xì)信息,包括注釋。
Reflection可以說是對(duì)php庫函數(shù):“Classes/Objects 類/對(duì)象函數(shù)”的一個(gè)擴(kuò)展。
主要用在通過程序檢測(cè)現(xiàn)有php程序內(nèi)部關(guān)于類、方法等信息,并做出處理。
2、API概覽:
class Reflection { }
interface Reflector { }
class ReflectionException extends Exception { }
class ReflectionFunction implements Reflector { }
class ReflectionParameter implements Reflector { }
class ReflectionMethod extends ReflectionFunction { }
class ReflectionClass implements Reflector { }
class ReflectionObject extends ReflectionClass { }
class ReflectionProperty implements Reflector { }
class ReflectionExtension implements Reflector { }
3、詳細(xì)說明:(例子詳見php手冊(cè))
①Reflection類
<?php
class Reflection
{
public static mixed export(Reflector r [,bool return])
//導(dǎo)出一個(gè)類或方法的詳細(xì)信息
public static array getModifierNames(int modifiers)
//取得修飾符的名字
}
?>
②ReflectionException類
該類繼承標(biāo)準(zhǔn)類,沒特殊方法和屬性。
③ReflectionFunction類
<?php
class ReflectionFunction implements Reflector
{
final private __clone()
public object __construct(string name)
public string __toString()
public static string export()
//導(dǎo)出該函數(shù)的詳細(xì)信息
public string getName()
//取得函數(shù)名
public bool isInternal()
//測(cè)試是否為系統(tǒng)內(nèi)部函數(shù)
public bool isUserDefined()
//測(cè)試是否為用戶自定義函數(shù)
public string getFileName()
//取得文件名,包括路徑名
public int getStartLine()
//取得定義函數(shù)的起始行
public int getEndLine()
//取得定義函數(shù)的結(jié)束行
public string getDocComment()
//取得函數(shù)的注釋
public array getStaticVariables()
//取得靜態(tài)變量
public mixed invoke(mixed* args)
//調(diào)用該函數(shù),通過參數(shù)列表傳參數(shù)
public mixed invokeArgs(array args)
//調(diào)用該函數(shù),通過數(shù)組傳參數(shù)
public bool returnsReference()
//測(cè)試該函數(shù)是否返回引用
public ReflectionParameter[] getParameters()
//取得該方法所需的參數(shù),返回值為對(duì)象數(shù)組
public int getNumberOfParameters()
//取得該方法所需的參數(shù)個(gè)數(shù)
public int getNumberOfRequiredParameters()
//取得該方法所需的參數(shù)個(gè)數(shù)
}
?>
④ReflectionParameter類:
<?php
class ReflectionParameter implements Reflector
{
final private __clone()
public object __construct(string name)
public string __toString()
public static string export()
//導(dǎo)出該參數(shù)的詳細(xì)信息
public string getName()
//取得參數(shù)名
public bool isPassedByReference()
//測(cè)試該參數(shù)是否通過引用傳遞參數(shù)
public ReflectionClass getClass()
//若該參數(shù)為對(duì)象,返回該對(duì)象的類名
public bool isArray()
//測(cè)試該參數(shù)是否為數(shù)組類型
public bool allowsNull()
//測(cè)試該參數(shù)是否允許為空
public bool isOptional()
//測(cè)試該參數(shù)是否為可選的,當(dāng)有默認(rèn)參數(shù)時(shí)可選
public bool isDefaultValueAvailable()
//測(cè)試該參數(shù)是否為默認(rèn)參數(shù)
public mixed getDefaultValue()
//取得該參數(shù)的默認(rèn)值
}
?>
⑤ReflectionClass類:
<?php
class ReflectionClass implements Reflector
{
final private __clone()
public object __construct(string name)
public string __toString()
public static string export()
//導(dǎo)出該類的詳細(xì)信息
public string getName()
//取得類名或接口名
public bool isInternal()
//測(cè)試該類是否為系統(tǒng)內(nèi)部類
public bool isUserDefined()
//測(cè)試該類是否為用戶自定義類
public bool isInstantiable()
//測(cè)試該類是否被實(shí)例化過
public bool hasConstant(string name)
//測(cè)試該類是否有特定的常量
public bool hasMethod(string name)
//測(cè)試該類是否有特定的方法
public bool hasProperty(string name)
//測(cè)試該類是否有特定的屬性
public string getFileName()
//取得定義該類的文件名,包括路徑名
public int getStartLine()
//取得定義該類的開始行
public int getEndLine()
//取得定義該類的結(jié)束行
public string getDocComment()
//取得該類的注釋
public ReflectionMethod getConstructor()
//取得該類的構(gòu)造函數(shù)信息
public ReflectionMethod getMethod(string name)
//取得該類的某個(gè)特定的方法信息
public ReflectionMethod[] getMethods()
//取得該類的所有的方法信息
public ReflectionProperty getProperty(string name)
//取得某個(gè)特定的屬性信息
public ReflectionProperty[] getProperties()
//取得該類的所有屬性信息
public array getConstants()
//取得該類所有常量信息
public mixed getConstant(string name)
//取得該類特定常量信息
public ReflectionClass[] getInterfaces()
//取得接口類信息
public bool isInterface()
//測(cè)試該類是否為接口
public bool isAbstract()
//測(cè)試該類是否為抽象類
public bool isFinal()
//測(cè)試該類是否聲明為final
public int getModifiers()
//取得該類的修飾符,返回值類型可能是個(gè)資源類型
//通過Reflection::getModifierNames($class->getModifiers())進(jìn)一步讀取
public bool isInstance(stdclass object)
//測(cè)試傳入的對(duì)象是否為該類的一個(gè)實(shí)例
public stdclass newInstance(mixed* args)
//創(chuàng)建該類實(shí)例
public ReflectionClass getParentClass()
//取得父類
public bool isSubclassOf(ReflectionClass class)
//測(cè)試傳入的類是否為該類的父類
public array getStaticProperties()
//取得該類的所有靜態(tài)屬性
public mixed getStaticPropertyValue(string name [, mixed default])
//取得該類的靜態(tài)屬性值,若private,則不可訪問
public void setStaticPropertyValue(string name, mixed value)
//設(shè)置該類的靜態(tài)屬性值,若private,則不可訪問,有悖封裝原則
public array getDefaultProperties()
//取得該類的屬性信息,不含靜態(tài)屬性
public bool isIterateable()
public bool implementsInterface(string name)
//測(cè)試是否實(shí)現(xiàn)了某個(gè)特定接口
public ReflectionExtension getExtension()
public string getExtensionName()
}
?>
⑥ReflectionMethod類:
<?php
class ReflectionMethod extends ReflectionFunction
{
public __construct(mixed class, string name)
public string __toString()
public static string export()
//導(dǎo)出該方法的信息
public mixed invoke(stdclass object, mixed* args)
//調(diào)用該方法
public mixed invokeArgs(stdclass object, array args)
//調(diào)用該方法,傳多參數(shù)
public bool isFinal()
//測(cè)試該方法是否為final
public bool isAbstract()
//測(cè)試該方法是否為abstract
public bool isPublic()
//測(cè)試該方法是否為public
public bool isPrivate()
//測(cè)試該方法是否為private
public bool isProtected()
//測(cè)試該方法是否為protected
public bool isStatic()
//測(cè)試該方法是否為static
public bool isConstructor()
//測(cè)試該方法是否為構(gòu)造函數(shù)
public bool isDestructor()
//測(cè)試該方法是否為析構(gòu)函數(shù)
public int getModifiers()
//取得該方法的修飾符
public ReflectionClass getDeclaringClass()
//取得該方法所屬的類
// Inherited from ReflectionFunction
final private __clone()
public string getName()
public bool isInternal()
public bool isUserDefined()
public string getFileName()
public int getStartLine()
public int getEndLine()
public string getDocComment()
public array getStaticVariables()
public bool returnsReference()
public ReflectionParameter[] getParameters()
public int getNumberOfParameters()
public int getNumberOfRequiredParameters()
}
?>
⑦ReflectionProperty類:
<?php
class ReflectionProperty implements Reflector
{
final private __clone()
public __construct(mixed class, string name)
public string __toString()
public static string export()
//導(dǎo)出該屬性的詳細(xì)信息
public string getName()
//取得該屬性名
public bool isPublic()
//測(cè)試該屬性名是否為public
public bool isPrivate()
//測(cè)試該屬性名是否為private
public bool isProtected()
//測(cè)試該屬性名是否為protected
public bool isStatic()
//測(cè)試該屬性名是否為static
public bool isDefault()
public int getModifiers()
//取得修飾符
public mixed getValue(stdclass object)
//取得該屬性值
public void setValue(stdclass object, mixed value)
//設(shè)置該屬性值
public ReflectionClass getDeclaringClass()
//取得定義該屬性的類
public string getDocComment()
//取得該屬性的注釋
}
?>
⑧ReflectionExtension類
<?php
class ReflectionExtension implements Reflector {
final private __clone()
public __construct(string name)
public string __toString()
public static string export()
//導(dǎo)出該擴(kuò)展的所有信息
public string getName()
//取得該擴(kuò)展的名字
public string getVersion()
//取得該擴(kuò)展的版本
public ReflectionFunction[] getFunctions()
//取得該擴(kuò)展的所有函數(shù)
public array getConstants()
//取得該擴(kuò)展的所有常量
public array getINIEntries()
//取得與該擴(kuò)展相關(guān)的,在php.ini中的指令信息
public ReflectionClass[] getClasses()
public array getClassNames()
}
?>
相關(guān)文章
- 這篇文章主要介紹了php面向?qū)ο笾械哪g(shù)方法中文說明,明白這些方法才好寫面向?qū)ο蟪绦?,需要的朋友可以參考?/div> 2014-03-03
php file_get_contents函數(shù)輕松采集html數(shù)據(jù)
PHP手冊(cè)里是這么解釋的:file_get_contents — 將整個(gè)文件讀入一個(gè)字符串,于是可以很容易的獲取其他站的信息,再用正則加以變換,再做一些判斷和設(shè)定,就OK了,不多說了,放代碼,我基本都做了解釋的。2010-04-04利用Laravel生成Gravatar頭像地址的優(yōu)雅方法
Gravatar是一圖像跟隨著您到訪過的網(wǎng)站,當(dāng)您在博客中留言或發(fā)表文章,它將會(huì)出現(xiàn)在您的名稱旁。下面這篇文章主要給大家介紹了關(guān)于利用Laravel如何生成 Gravatar 頭像地址的優(yōu)雅方法,需要的朋友可以參考下。2017-12-12Thinkphp框架+Layui實(shí)現(xiàn)圖片/文件上傳功能分析
這篇文章主要介紹了Thinkphp框架+Layui實(shí)現(xiàn)圖片/文件上傳功能,結(jié)合實(shí)例形式詳細(xì)分析了Thinkphp+Layui實(shí)現(xiàn)圖片文件上傳的具體步驟、原理與相關(guān)操作技巧,需要的朋友可以參考下2020-02-02詳解關(guān)于php的xdebug配置(編輯器vscode)
這篇文章主要介紹了詳解關(guān)于php的xdebug配置(編輯器vscode),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01最新評(píng)論