首頁  >  文章  >  後端開發  >  PHP 反射之動態代理

PHP 反射之動態代理

藏色散人
藏色散人轉載
2019-09-23 09:14:093425瀏覽

反射可以探知類別的內部結構 可以用它來做 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中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除