私は新しいアプリを始めていますが、ついに名前空間を使用して新しい時代に参加することにしました。私は常に次のようなコードを書いていることに気づきました:
$dynamicControllerName = "MyController";
$controllerName = "System\\App\\Controllers\\" . $dynamicControllerName;
$controller = new $controller;
キーワードを使用しようとすると、use
うまくいかないようです (または、正しく理解できません)。
use System\App\Controllers as Controller
その後
$dynamicControllerName = "MyController";
$controllerName = "Controller\\" . $dynamicControllerName;
$controller = new $controller;
これにより、オートローダーは、パスが目的の「/System/App/Controllers/MyController」ではなく、「/Controller/MyController」に加えた基本パスであると認識します。接頭辞スラッシュの有無にかかわらず、さまざまな組み合わせを試しました。
私が試みていることの実際の例は次のようになります(MyControllerを取得しようとしています):
namespace System\App\Lib;
use System\App\Controllers as Controller;
class Router
{
public function dispatch(Request $request)
{
//...some dispatch code here
// Instantiate Controller (THIS DOESNT WORK)
$controllerName = "Controller\\" . $request->controller;
$controller = new $controllerName($param1, $param2);
//...some dispatch code here
}
}
上記は、オートローダーからSystem\App\Controllers\MyControllerというクラスを要求すると思います。その後、スラッシュを反転してファイル拡張子を追加すると出来上がりです。代わりに、存在しないController\MyControllerとして送信されます。Routerクラスが別の名前空間にあるためですか? 私は何が欠けていますか?
TL;DR; MVC パターンで、毎回完全修飾名前空間を入力することなく、クラス インスタンスを動的にインスタンス化するにはどうすればよいですか?
PS私はPHP 5.4.15を使用しています
編集
自動ロードは次のようにセットアップされます。
// Define AutoLoading
spl_autoload_register(array('System\App', 'autoload'));
オートロード機能:
/**
* Autoloading via PSR-0 Namespacing
*/
protected static function autoload($className = false)
{
var_dump($className);
if($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strripos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
$fileName = App::$SYS_PATH . DIRECTORY_SEPARATOR . $fileName;
include_once $fileName;
}
}
のダンプを行うと、$className
PHP が名前空間を認識しているかどうかを確認できます。