反射可以探知類別的內部結構 可以用它來做 hook 實作插件功能,或是做動態代理。
與反射相關
類別和物件相關的函數
get_object_vars get_class_methods get_class_vars get_class get_parent_class method_exists property_exists trait_exists
反射相關的API 類別
reflectiontype reflectionproperty reflectionobject reflectionfunction reflectionmethod reflectionexception reflectionextension reflectionparameter reflectionfunctionabstract reflectiongenerator reflectionclass reflectionclassconstant reflectionzendextension
反射API 功能更強大,甚至能還原這個類別的原型,包括方法的存取權限等
應用程式場景
一個是對物件進行調試,另一個是獲取類別的信息,通常有以下應用方式
文檔生成用它對文件裡的類別進行掃描,生成描述文檔
插件開發在MVC 和插件開發中,常見使用反射
缺點
反射的效能消耗也很大,一般情況下盡量不使用
會破壞類別的封裝性,因為反射可以使本不應該暴露的方法或屬性被強制暴露了出來
實例
下面是一個利用反射特性,實現的簡單的資料庫動態代理
基於動態代理,可以有更多的想像空間,如實現攔截器,屬性方法增加,裁剪等等
class Mysql { function connect($db){ echo "connecting database ${db[0]}\r\n"; } } class SqlProxy { private $target; function __construct($tar){ $this->target[] = new $tar(); } function __call($name, $args){ if($method = $r->getMethod($name)){ if($method->isPublic() && !$method->isAbstract()){ echo "method before record \r\n"; $method->invoke($obj,$args); echo "method after record\r\n"; } } } } } $obj = new SqlProxy('Mysql'); $obj->connect('member');
其它
##echo 與print 都是語言結構,但是後者有返回值print_r 和var_dump 是普通函數皆可列印多種類型數據,但後者會輸出數據類型,前者第二參數可改變輸出為返回推薦:《PHP教程》
以上是PHP 反射之動態代理的詳細內容。更多資訊請關注PHP中文網其他相關文章!