反射的理解
它是指在php的運行狀態中,擴展分析php程序,導出或者提取出關於類、方法、屬性、參數等詳細信息,甚至包括注釋。這種動態獲取的信息以及動態調用對象的方法的功能稱為反射API。反射是操縱面向對象模型中元模型的API,其功能十分強大,可以幫助我們構建復雜,可擴展的應用。(ps:包括在工廠模式中的使用)
反射API是php內建的oop技術擴展,包括一些類、異常和接口,綜合使用他們可用來幫助我們分析其它類,接口,方法,屬性和擴展。這些oop擴展被稱為反射。
ReflectionClass
[php]
<?php
class ReflectionClass implements Reflector
{
final private __clone()
public object __construct(string name)
public string __toString()
public static string export()
//導出該類的詳細信息
public string getName()
//取得類名或接口名
public bool isInternal()
//測試該類是否為系統內部類
public bool isUserDefined()
//測試該類是否為用戶自定義類
public bool isInstantiable()
//測試該類是否被實例化過
public bool hasConstant(string name)
//測試該類是否有特定的常量
public bool hasMethod(string name)
//測試該類是否有特定的方法
public bool hasProperty(string name)
//測試該類是否有特定的屬性
public string getFileName()
//取得定義該類的文件名,包括路徑名
public int getStartLine()
//取得定義該類的開始行
public int getEndLine()
//取得定義該類的結束行
public string getDocComment()
//取得該類的注釋
public ReflectionMethod getConstructor()
//取得該類的構造函數信息
public ReflectionMethod getMethod(string name)
//取得該類的某個特定的方法信息
public ReflectionMethod[] getMethods()
//取得該類的所有的方法信息
public ReflectionProperty getProperty(string name)
//取得某個特定的屬性信息
public ReflectionProperty[] getProperties()
//取得該類的所有屬性信息
public array getConstants()
//取得該類所有常量信息
public mixed getConstant(string name)
//取得該類特定常量信息
public ReflectionClass[] getInterfaces()
//取得接口類信息
public bool isInterface()
//測試該類是否為接口
public bool isAbstract()
//測試該類是否為抽象類
public bool isFinal()
//測試該類是否聲明為final
public int getModifiers()
//取得該類的修飾符,返回值類型可能是個資源類型
//通過Reflection::getModifierNames($class->getModifiers())進一步讀取
public bool isInstance(stdclass object)
//測試傳入的對象是否為該類的一個實例
public stdclass newInstance(mixed* args)
//創建該類實例
public ReflectionClass getParentClass()
//取得父類
public bool isSubclassOf(ReflectionClass class)
//測試傳入的類是否為該類的父類
public array getStaticProperties()
//取得該類的所有靜態屬性
public mixed getStaticPropertyValue(string name [, mixed default])
//取得該類的靜態屬性值,若private,則不可訪問
public void setStaticPropertyValue(string name, mixed value)
//設置該類的靜態屬性值,若private,則不可訪問,有悖封裝原則
public array getDefaultProperties()
//取得該類的屬性信息,不含靜態屬性
public bool isIterateable()
public bool implementsInterface(string name)
//測試是否實現了某個特定接口
public ReflectionExtension getExtension()
public string getExtensionName()
}
?>
工廠模式應用:
[php]
class MoveDataFactory
{
/**
* Description:簡單工廠模式,根據mode選取不同實例化對象
* @return 對象實例
*/
public function GetMoveClass($classname)
{
$reflectionclass = new ReflectionClass($classname);
return $reflectionclass->newInstance();
}
}