我正在研究几个PHP框架,然后决定构建我自己的框架。但我面临一个问题。我有一个动态处理HTTP请求的Router类,它基本上将URL分解为将其除以斜杠并将其存储到数组中的元素,然后调用函数来检查第一个元素是否是有效的Controller。如果它是有效的,该函数应该要求它,但那就是我被卡住的地方,因为我似乎不需要像这样的文件:
if (file_exists(CONTROLLERS_DIR . $this->url[0] . '.php')) { require \App\Controllers\$this->url[0] }
如何使用名称空间需要这样的文件?
感谢。
答案 0 :(得分:2)
"我如何要求使用名称空间的文件?"
你不能。命名空间与它无关。
" PHP命名空间提供了一种对相关类,接口,函数和常量进行分组的方法。" 〜Namespaces overview
require
是关于文件依赖性的,无论名称空间如何:
if (file_exists(CONTROLLERS_DIR . $this->url[0] . '.php')) {
require(CONTROLLERS_DIR . $this->url[0] . '.php');
}
编辑:您可能希望使用在运行时检索的命名空间和类名来实例化类,例如:
namespace \App\Controllers;
class C {
protected $_i;
public function __construct($i){ $this->_i = $i; }
public function foo(){ echo $this->_i; }
}
和某处:
$className = "C"; // or $className = $this->whatever...
$class = "\\App\\Controllers\\".$className;
$instance = new $class(7);
$instance->foo(); // outputs 7
答案 1 :(得分:0)
我已经构建了几个框架,我明白你要做什么...... 基本上当你有一些路径,例如“HelloWorld \ addComment”
您想创建控制器实例
\App\Controllers\HelloWorldController
有多种方法可以解决它,我喜欢的方法是:
使用spl autoloader http://php.net/manual/en/function.spl-autoload.php
在我提供的链接中,您可以获得所需的示例。
然后你最终可以做到
$controller = new \App\Controllers\HelloWorldController();
您应该将HelloWorldController置于与名称空间
匹配的正确名称空间+维护目录结构中app
Controllers
HelloWorldController
spl autoloader将为您做正确的工作,通常默认实现就足够了 - 但是很容易创建自己的spl自动加载器和register it
稍后您可以通过method_exist或reflection ...
测试$ controller是否具有您需要的方法