Пространства имен PHP 5.3 в Symfony 2 - PullRequest
2 голосов
/ 23 февраля 2012

Я начинаю работать с 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>');
    }
}

Теперь у меня есть несколько вопросов

  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 работают без обратной косой черты?

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

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, вы бы установили соединение с базой данных, и все такое.

Надеюсь, это поможет.

2 голосов
/ 23 февраля 2012

Я только очень кратко использовал Symfony2, но вот мои ответы:

1) Это будет потому, что Symfony нужен ваш контроллер для существования в пространстве имен DemoCompany\HelloBundle\Controller для автозагрузки

2) На use Symfony\Component\HttpFoundation\Response; вы говорите PHP, чтобы он смотрел там, если метод не может быть найден локально

3) Не знаю на этом ...

4) Встроенные функции PHP не находятся в каком-либо определенном пространстве имен (пространства имен являются новыми для PHP), поэтому работают где угодно

...