#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
. Не могли бы вы также показать код, из которого вы пытаетесь фактически использовать этот класс (т. Е. Контроллер).