【问题标题】:PHP 5.3 namespaces in Symfony 2Symfony 2 中的 PHP 5.3 命名空间
【发布时间】:2012-03-13 18:46:14
【问题描述】:

我开始使用 Symfony 2 并且正在关注 this 教程。现在,本教程很简单,我能够完全按照它进行操作。这是我的控制器中的代码

<?php
namespace DemoCompany\HelloBundle\Controller;

use Symfony\Component\HttpFoundation\Response;

class HelloController{
    public function indexAction($name){
        return new Response('<h1>hello ' . ucfirst($name) . '</h1>');
    }
}

现在,我有一些问题

  1. 当我在不包含namespace DemoCompany\HelloBundle\Controller; 的情况下运行代码时,它给了我一个错误。但是当包含这条线时它确实可以正常工作;所以我想知道:为什么它与命名空间语句一起使用以及为什么它在没有命名空间的情况下不起作用。请澄清。

  2. 后续问题:我正在返回一个新的 Response 对象,但它既没有被定义,我的类 HelloController 也没有扩展一些基类(可能定义了这个响应对象)。所以问题是:PHP 是如何找到并加载这个文件的?

  3. 在 Symfony 中,自定义控制器/模型/视图是否需要扩展一些基类?例如,在 Codeigniter 中,我们必须执行 class Blog extends CI_Controller 之类的操作,以便 CI_Controller 中定义的所有方法都可以使用 $this 在当前范围内使用。 Symfony 有相同的做法还是做了不同的事情?

  4. 既然这个控制器的命名空间是DemoCompany\HelloBundle\Controller,那么普通的PHP函数如何在没有反斜杠的情况下工作?

【问题讨论】:

    标签: php symfony namespaces


    【解决方案1】:

    我只是非常简单地使用过 Symfony2,不过这里是我的答案:

    1) 那是因为 Symfony 需要您的 Controller 存在于 DemoCompany\HelloBundle\Controller 命名空间中才能自动加载

    2) 在use Symfony\Component\HttpFoundation\Response;,如果在本地找不到该方法,您告诉 PHP 去那里查看

    3) 不知道那个...

    4) 内置 PHP 函数不在任何特定的命名空间中(命名空间对 PHP 来说是新的),所以可以在任何地方工作

    【讨论】:

    • Re 4:实际上内置函数在全局命名空间中,所以如果在当前命名空间中找不到函数func(),PHP 会从全局命名空间返回func()。您可以通过在它们前面加上 \ 来显式调用这些函数,例如 \func()
    • Re 4:对于内置对象,但是您需要反斜杠,例如:new \SplFileObject
    【解决方案2】:

    1:命名空间充当某种“文件夹”,您可以使用它封装项目以避免命名冲突。您应该继续阅读有关此事的所有 PHP 文档:Namespaces overview。不包括它意味着您正在使用全局命名空间或\,而使用它告诉PHP文件中的所有内容都属于声明的命名空间,因此HelloController的完全限定名称变为DemoCompany\HelloBundle\Controller\HelloController

    2:Request 类实际上是在您 use Symfony\Component\HttpFoundation\Response 时定义的。该声明告诉 PHP 和 Symfony 查找该类,可能使用 spl_register_autoloader,并将其包含在当前命名空间中,以便您可以使用短名称 Response 而不是 FQN。

    4:PHP 实际上会查找您调用的每个类/函数,首先在声明的命名空间中进行搜索,然后再向上移动到全局命名空间。您真的应该阅读文档,它在学习这些相对较新的功能(至少对于 PHP)时帮助了我很多

    关于#3,我不知道,但我想你可以选择不扩展任何其他基类,如果你选择这样做的话。当然,这不会让您的代码继承父类设置的方法,您必须自己实现这些方法。例如,不扩展基类 Model 会使您建立与数据库的连接等。

    希望这会有所帮助。

    【讨论】:

    • 对于第三季度,Symfony 2 确实提供了一个具有一些有用功能的基本控制器类,但您不必从它扩展。任何课程都可以。强烈建议您逐步完成手册。您的所有问题不仅得到了解答,而且得到了详细的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2011-07-27
    相关资源
    最近更新 更多