Symfony 2 中的 PHP 5.3 命名空间

Cur*_*ind 2 php namespaces symfony

我正在开始使用 Symfony 2 并且正在遵循教程。现在,本教程很简单,我能够完全遵循它。这是我的控制器中的代码

<?php
namespace DemoCompany\HelloBundle\Controller;

use Symfony\Component\HttpFoundation\Response;

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

现在,我有一些问题

  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 函数如何在没有反斜杠的情况下工作呢?

Rob*_*rto 5

1:命名空间充当某种“文件夹”,您可以使用它来封装项目以避免命名冲突。您应该继续阅读有关此问题的所有 PHP 文档:命名空间概述。不包含它意味着您正在使用全局名称空间,或者\,在使用它时告诉 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类将使您设置与数据库的连接等。

希望这可以帮助。