2013-11-03 28 views
2

我想爲我的數據庫創建一個小的RESTful API,並且我基於用戶請求動態創建控制器對象時遇到了問題,因爲我的所有代碼都使用命名空間,這樣做:動態創建一個具有不同名稱空間的類中的新對象

$api = new $controllerName($request); 

將無法​​正常工作。由於$controllerName將解析爲「ReadController」,但實際上是\controllers\lottery\ReadController因此錯誤

定義到類路徑的整個部分是:

if ($method === 'GET') { 
    $controllerName = 'ReadController'; 
    // @NOTE: $category is a part of $_GET parameters, e.g: /api/lottery <- lottery is a $category 
    $controllerFile = CONTROLLERS.$category.'/'.$controllerName.'.php'; 
    if (file_exists($controllerFile)) { 
     include_once($controllerFile); 

     $api = new $controllerName($request); 
    } else { 
     throw new \Exception('Undefined controller'); 
    } 
} 

而且ReadController的核心\控制器聲明\彩票\ ReadController.php

namespace controllers\lottery; 

class ReadController extends \core\API { 

} 

任何想法如何動態創建對象?

謝謝!

回答

5
$controllerName = 'controllers\lottery\ReadController'; 
new $controllerName($request); 

類從字符串實例必須始終使用完全限定類名

+0

那簡單......該死..謝謝,它工作。將在10分鐘內接受答案。 – deb0rian

+0

是的,我有類似的問題。唯一需要改進的地方是:_why_事實如此。這是因爲PHP會將名稱空間別名替換爲解釋時的完整路徑,所以別名不會存在於操作碼中,虛擬機將不會知道它們。 –

+0

@Alma我認爲這樣解釋太詳細了。它就像http://stackoverflow.com/a/16808358/476 – deceze

相關問題