php: использование расширений с псевдонимом класса

У меня есть классы в двух разных пространствах имен, например:

Контроллер находится в \ Core, индекс находится в \ Public

В моем index.php у меня есть class_alias для всех классов \ Core, поэтому вы можете вызывать их напрямую: $controller = new Controller();. Это работает без проблем.

Моя проблема в том, что я пытаюсь расширить класс. Поскольку индекс и контроллер находятся в разных пространствах имен, он пытается найти контроллер в пространстве имен \ Public, поэтому это не сработает:

<?php
namespace Panel\Pub;

class Index extends Controller {

Есть ли способ обойти это, чтобы я мог использовать псевдоним класса в функции extends? Я знаю, что могу использовать \ Core \ Controller, и он будет работать, но я пытаюсь использовать псевдонимы, чтобы сделать основные функции более доступными.

Изменить: найдено одно обходное решение. Проведя еще несколько тестов, я обнаружил, что использование \ перед псевдонимом в расширении, похоже, работает. Не так идеально, как no \, но на данный момент лучшее решение приводит к:

class Index extends \Controller { }

Все еще ищу другие советы по обходному пути или другому методу расширения контроллера.

Спасибо!


person Devon    schedule 13.11.2013    source источник


Ответы (1)


Когда вы используете пространство имен, вы используете полный путь в своем пространстве имен

class Index extends \Public\Controller { }

\ представляет корень вашего пространства имен.


Другой способ сделать это - использовать ключевое слово use.

namespace Panel\Pub;
use \Public\Controller as Controller
class Index extends Controller { }
person Machavity♦    schedule 13.11.2013
comment
Да, это будет \ Core \ Controller, но я пытаюсь понять, есть ли способ использовать псевдоним, который я установил для Controller, чтобы избежать использования метода use / full qualified. - person Devon; 13.11.2013
comment
Да, я тоже знаю о способе использования. Я надеялся, что мне не придется дублировать это или \ Core \ во всех сценариях, расширяющих основные классы. - person Devon; 13.11.2013
comment
class_alias устанавливается в индексе. Псевдоним класса позволяет вам вызывать классы по псевдониму, у меня псевдоним установлен от \ Core \ Controller до Controller. Однако этот псевдоним недоступен, когда я пытаюсь расширить Controller, только когда я вызываю класс напрямую. Я искал, есть ли способ применить псевдоним к расширениям. Знаю стандартные методы. - person Devon; 13.11.2013
comment
Тогда я не уверен, что понимаю. Вы хотите расширить Controller, который расширяется на Index? - person Machavity♦; 13.11.2013
comment
Думаю, вы могли бы посмотреть на это так. Class_alias установлен так, что основной скрипт распознает Controller, а не только \ Core \ Controller, что похоже на предоставленный вами метод 'use as'. Основной скрипт вызывает класс \ Public \ Index, который расширяет Controller. В то время как основной сценарий может вызывать только Controller, \ Public \ Index не может и должен вызывать \ Core \ Controller. У PHP может не быть метода для решения этой проблемы, я его искал. Кажется более логичным найти решение, чтобы не вызывать \ Core каждый раз, но я использую пространства имен на протяжении всего проекта. - person Devon; 13.11.2013
comment
Возможно, в версии 5.3 нет способа сделать это. В 5.4 были введены Traits, которые также используют use, но внутри класса и работают как прямое копирование и вставка. Таким образом, вы можете включать Controller так часто, как хотите (при условии, что у меня все это прямо) - person Machavity♦; 13.11.2013
comment
Что ж, спасибо за попытку помочь, я нашел небольшую работу. Он распознает псевдоним, если я использую \ Controller. Полагаю, это лучше, чем \ Core \ Controller. Все еще не так идеально, как «нет», но добираюсь до цели. - person Devon; 13.11.2013