Symfony 2中的PHP 5.3命名空间

时间:2012-02-23 11:04:11

标签: php symfony namespaces

我开始使用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;的情况下运行代码时,它会给我一个错误。但是当包含这条线时它确实可以正常工作;所以我想知道:为什么它适用于命名空间语句&amp;为什么没有名称空间它不起作用。请澄清。

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

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

  4. 由于此控制器被命名为DemoCompany\HelloBundle\Controller,为什么普通的PHP函数在没有反斜杠的情况下工作?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

希望这有帮助。

答案 1 :(得分:2)

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

1)这是因为Symfony需要您的Controller存在于DemoCompany\HelloBundle\Controller命名空间中以进行自动加载

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

3)不知道那个......

4)内置的PHP函数不在任何特定的命名空间中(命名空间是PHP的新功能),因此可以在任何地方工作