本文實例講述了php反射學習之依賴注入。分享給大家供大家參考,具體如下:
先看代碼:
<?phpif (PHP_SAPI != 'cli') { exit('Please run it in terminal!');}if ($argc < 3) { exit('At least 2 arguments needed!');}$controller = ucfirst($argv[1]) . 'Controller';$action = 'action' . ucfirst($argv[2]);// 檢查類是否存在if (!class_exists($controller)) { exit("Class $controller does not existed!");}// 獲取類的反射$reflector = new ReflectionClass($controller);// 檢查方法是否存在if (!$reflector->hasMethod($action)) { exit("Method $action does not existed!");}// 取類的構造函數$constructor = $reflector->getConstructor();// 取構造函數的參數$parameters = $constructor->getParameters();// 遍歷參數foreach ($parameters as $key => $parameter) { // 獲取參數聲明的類 $injector = new ReflectionClass($parameter->getClass()->name); // 實例化參數聲明類并填入參數列表 $parameters[$key] = $injector->newInstance();}// 使用參數列表實例 controller 類$instance = $reflector->newInstanceArgs($parameters);// 執行$instance->$action();class HelloController{ private $model; public function __construct(TestModel $model) { $this->model = $model; } public function actionWorld() { echo $this->model->property, PHP_EOL; }}class TestModel{ public $property = 'property';}
(以上代碼非原創)將以上代碼保存為 run.php
運行方式,在終端下執行php run.php Hello World
可以看到,我們要執行 HelloController 下的 WorldAction,
HelloController 的構造函數需要一個 TestModel類型的對象,
通過php 反射,我們實現了, TestModel 對象的自動注入,
上面的例子類似于一個請求分發的過程,是路由請求的分發的一部分,假如我們要接收一個請求 地址例如: /Hello/World
意思是要執行 HelloController 下的 WorldAction 方法。
希望本文所述對大家PHP程序設計有所幫助。
新聞熱點
疑難解答
圖片精選