Symfony2, наследование в том же пространстве имен, но в другом файле

#symfony #inheritance #namespaces

#symfony #наследование #пространства имен

Вопрос:

С недели я влюблен в Symfony2. У меня есть связка сообщений обратной связи: src/Erwine/FeedBackMessageBundle .

Я поместил несколько пользовательских классов из другого проекта в: src/Erwine/FeedBackMessageBundle/FeedBackMessage .

Все классы имеют одно и то же пространство имен : ErwineFeedBackMessageBundleFeedBackMessage .

У меня есть несколько реализаций в разных файлах. Допустим:
FeedBackMessageClassOne
FeedBackMessageClassTwo
FeedBackMessageClassThree

Первый живет в своем собственном файле. Если два расширяются от одного, я получил сбой. Я пробовал use... и т.д.

Два и три живут как близнецы в одном файле. Если три наследуют от двух, это работает.
Экземпляр одного в контроллере не проблема.

Мне кажется, наследование классов в одном и том же пространстве имен в разных файлах не работает. Нет, нет, нет, конечно, нет, я делаю что-то не так. Не так ли? Но что? Является ли это автозагрузкой в Symfony2 для пользовательских классов?

Я использую composer для зависимостей.

Обновить
Вот моя реализация:

 <?php  

namespace ErwineFeedBackMessageBundleFeedBackMessage;

class FeedBackMessageHandlerImpl extends FeedBackMessageHandlerImplTwee
{
    public function __construct() 
    {
        //var_dump('constructed');
        //parent::__construct();
    }

    //public function getFeedBackMessageGeneralOverride(){};
}
 

Комментарии:

1. Не могли бы вы опубликовать точное сообщение об ошибке, которое вы получаете? Я обновлю свой ответ, если он еще не решил вашу проблему.

Ответ №1:

При условии, что ваша автозагрузка настроена правильно, это должно быть что-то вроде этого:

Структура папок:

 src/
    Erwine/
        FeedBackMessageBundle/
            FeedBackMessage/
                FeedBackMessageClassOne.php
                FeedBackMessageClassTwo.php
                FeedBackMessageClassThree.php
 

FeedBackMessageClassOne.php:

 <?php

namespace ErwineFeedBackMessageBundleFeedBackMessage;

class FeedBackMessageClassOne 
{
    // Contents of class...
}
 

FeedBackMessageClassTwo.php:

 <?php

namespace ErwineFeedBackMessageBundleFeedBackMessage;

class FeedBackMessageClassTwo extends FeedBackMessageClassOne 
{
    // Contents of class...
}
 

Вам не понадобится use оператор для расширения во втором файле, поскольку файл находится в том же пространстве имен, поэтому, определив то же пространство имен во втором классе, вы сможете использовать первый класс без инструкции use .

Убедитесь, что ваша автозагрузка настроена правильно.

Важно, чтобы вы сохраняли каждый класс в отдельном файле, а также чтобы вы называли файлы так же, как классы.

Это потому, что Symfony использует PSR-0 по умолчанию, если вы используете автозагрузчик composer. Перейдите сюда, чтобы узнать больше о PSR-0

Комментарии:

1. Я удалил ‘FeedBackMessageThree’ из файла. Теперь это то же самое, что вы описали. Я буду искать информацию о автозагрузке. Должен ли я указывать на пространство имен?

2. Что ж, я могу помочь вам с этим. Если вы обновите свой вопрос и включите текущий исходный код, это очень поможет. Кроме того, не могли бы вы сообщить мне точные имена задействованных файлов?

3. Спасибо за ваши ответы. Вот моя реализация: <?php namespace ErwineFeedBackMessageBundleFeedBackMessage; class FeedBackMessageHandlerImpl extends FeedBackMessageHandlerImplTwee { public function __construct() { //var_dump('constructed'); //parent::__construct(); } //public function getFeedBackMessageGeneralOverride(){}; }

4. Спасибо за публикацию. Просто для подтверждения, вызывается ли этот файл FeedBackMessageHandlerImpl.php ? И вызывается ли файл, который FeedBackMessageHandlerImplTwee находится в FeedBackMessageHandlerImplTwee.php ?

5. Хорошо, вы получаете сообщение об ошибке при этом? Если нет, не могли бы вы убедиться, что используете фронт-контроллер разработчика. Для этого вы должны сделать что-то вроде этого: http://example.domain/app_dev.php/path/parts вместо http://example.domain/path/parts . Не могли бы вы также показать код, из которого вы пытаетесь фактически использовать этот класс (т. Е. Контроллер).