【问题标题】:How to namespace in a front controller situation using PHP如何使用 PHP 在前端控制器情况下命名空间
【发布时间】:2010-11-12 16:31:19
【问题描述】:

好的,我有一个很小的框架,我希望尽快开源,我正在尝试实现命名空间,以便控制器和模型不需要附加文本。下面是基本的代码逻辑:

  • 网址请求
  • htaccess 重新路由到启动框架的 index.php
  • 框架解析路由并确定要实例化和触发的控制器/动作
    • 框架的前端控制器是“Controller”,项目控制器扩展了“Controller”

所以为了让控制器被命名,例如:

class Foo extends Controller {}

然后是模型:

class Foo extends Model {}

我的目录结构是这样的:

project/
    controllers/
        foo.php
    models/
        foo.php

所以,我显然需要实现命名空间。 (是的,我正在运行 php 5.3)。所以我的问题是,在前端控制器和模型由其他控制器和模型扩展的情况下,我将如何实现命名空间?

【问题讨论】:

  • 有兴趣在项目完成时检查项目.. !!

标签: php namespaces


【解决方案1】:

一种方法是手动添加命名空间,假设您的控制器位于同一空间中。举个例子。

public function __construct( $controller, $model )
{
    $this->controller = 'Application\Controllers\\' . $controller;
    $this->model      = 'Application\Models\\'      . $model;
}

可能有一种更自动加载的方式,但我认为这在大多数情况下就足够了。不要引用我,但也许您可以使用反射并获取被调用对象的名称空间。但是,这可能仍然需要更独特的命名约定,否则自动加载器仍然不会知道您是在调用 Controllers\Index.php 还是 Views\Index.php

【讨论】:

    【解决方案2】:

    始终检查 php.net...http://php.net/namespace

    【讨论】:

    • 我已经仔细阅读了 php 的命名空间文档(这通常不是给定的吗?),但是,我的问题的本质是特定于使用前端控制器动态加载/触发项目控制器的命名空间。意思是,我不希望使用框架的人必须 Foo 扩展项目\控制器\控制器。 'use project\controllers\Foo as Foo' 是我需要的,但这不是动态的,仍然需要在项目控制器文件中设置。有意义吗?
    • 好的,但是我从来没有看到(并且看到)命名空间的意义......只要正确命名类......
    • 那么您可能从未开发过应用程序。超过 10 个班级。
    • 实际上,我确实(并且确实)...只要正确命名它们!我永远不必使用双重名称,因为我的所有班级都没有做同样的事情(这会浪费我的时间)所以他们有其他名字......
    • 这甚至不是一个真正的答案。这个问题非常清晰和简洁,值得一提的 RTFM 通知。他要查找的内容不在 PHP 手册中,如果是,这不是指出它的适当方式。
    猜你喜欢
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多