PHP 反射之動態代理

藏色散人
發布: 2023-04-07 12:52:01
轉載
3504 人瀏覽過

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

相關標籤:
php
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!