需要在PHP中使用命名空间的动态类

时间:2015-10-01 14:25:32

标签: php model-view-controller namespaces require

我正在研究几个PHP框架,然后决定构建我自己的框架。但我面临一个问题。我有一个动态处理HTTP请求的Router类,它基本上将URL分解为将其除以斜杠并将其存储到数组中的元素,然后调用函数来检查第一个元素是否是有效的Controller。如果它是有效的,该函数应该要求它,但那就是我被卡住的地方,因为我似乎不需要像这样的文件:

if (file_exists(CONTROLLERS_DIR . $this->url[0] . '.php')) { require \App\Controllers\$this->url[0] }

如何使用名称空间需要这样的文件?

感谢。

2 个答案:

答案 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是否具有您需要的方法