php中反射的應用

來源:互聯網
上載者:User
這篇文章主要為大家詳細介紹了php中反射的應用,何為反射,反射的作用是什麼,感興趣的小夥伴們可以參考一下

反射是在PHP運行狀態中,擴充分析PHP程式,匯出或提取出關於類、方法、屬性、參數等的詳細資料,包括注釋。這種動態擷取的資訊以及動態調用對象的方法的功能稱為反射API。反射是操縱物件導向範型中元模型的API,其功能十分強大,可協助我們構建複雜,可擴充的應用。
其用途如:自動載入外掛程式,自動產生文檔,甚至可用來擴充PHP語言。
php反射api由若干類組成,可協助我們用來訪問程式的中繼資料或者同相關的注釋互動。藉助反射我們可以擷取諸如類實現了那些方法,建立一個類的執行個體(不同於用new建立),調用一個方法(也不同於常規調用),傳遞參數,動態調用類的靜態方法。
反射api是php內建的oop技術擴充,包括一些類,異常和介面,綜合使用他們可用來協助我們分析其它類,介面,方法,屬性,方法和擴充。這些oop擴充被稱為反射。
通過ReflectionClass,我們可以得到Person類的以下資訊:

1)常量 Contants
2)屬性 Property Names
3)方法 Method Names靜態
4)屬性 Static Properties
5)命名空間 Namespace
6)Person類是否為final或者abstract

然後就去看了看thinkphp的源碼,對於MVC的實現也有不同的體驗 ThinkPHP\Lib\Core\App.class.php 中的exec方法

if(!preg_match('/^[A-Za-z](\w)*$/',$action)){    // 非法操作    throw new ReflectionException();   }   //執行當前操作   $method = new ReflectionMethod($module, $action); #查看方法   if($method->isPublic()) {    $class = new ReflectionClass($module); #反射控制器    // 前置操作    if($class->hasMethod('_before_'.$action)) {     $before = $class->getMethod('_before_'.$action);     if($before->isPublic()) {      $before->invoke($module);     }    }    // URL參數綁定檢測    if(C('URL_PARAMS_BIND') && $method->getNumberOfParameters()>0){     switch($_SERVER['REQUEST_METHOD']) {      case 'POST':       $vars = $_POST;       break;      case 'PUT':       parse_str(file_get_contents('php://input'), $vars);       break;      default:       $vars = $_GET;     }     $params = $method->getParameters();     foreach ($params as $param){      $name = $param->getName();      if(isset($vars[$name])) {       $args[] = $vars[$name];      }elseif($param->isDefaultValueAvailable()){       $args[] = $param->getDefaultValue();      }else{       throw_exception(L('_PARAM_ERROR_').':'.$name);      }     }     $method->invokeArgs($module,$args);    }else{     $method->invoke($module); #執行我們需要調用函數    }    // 後置操作    if($class->hasMethod('_after_'.$action)) {     $after = $class->getMethod('_after_'.$action);     if($after->isPublic()) {      $after->invoke($module);     }    }

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.