Как вызывать переопределенные классы внутри базового класса? Ситуация такая: есть два базовых классаloader = new Loader();
}
}namespace AppBase;
class Loader {}
И есть наследуемые классы:namespace AppExample;
class App extends \AppBase\App {}namespace AppExample;
class Loader extends \AppBase\Loader {}
Как, не переопределяя конструктор \AppBase\App, сделать так, чтобы в \AppExample\App::$loader создавался экземпляр класса \AppExample\Loader, а не \AppBase\Loader?
Явно прописывать namespace в базовом классе нельзя - оно заранее неизвестно. Я вижу только два варианта:
1) поле со строкой, содержащей полное название класса ( public $loaderClass = '\AppExample\Loader'; )
2) функция, возвращаяющая объект Loader
В обоих случаях переопределить какой именно класс вызывается в конструкторе \AppExample\App будет довольно просто, но мне не кажутся эти решения удачными.
Еще один вариант - определять get_called_class(), отсекать NS, искать в отсеченном NS класс Loader, и если он не найден - то вызывать из текущего.
Может быть есть более стандартные решения этого вопроса?

21 Авг 2019 в 07:07
156 +1
0
Ответы
1

В данной ситуации можно воспользоваться поздним статическим связыванием для создания экземпляра нужного класса Loader внутри класса App. Для этого можно использовать статический метод в базовом классе App, который будет создавать экземпляр нужного класса Loader.

Пример кода:

namespace AppBase;
class App
{
protected $loader;
public function __construct()
{
$this->loader = static::createLoader();
}
protected static function createLoader()
{
return new Loader();
}
}
namespace AppExample;
class App extends \AppBase\App
{
protected static function createLoader()
{
return new Loader();
}
}
namespace AppBase;
class Loader {}
namespace AppExample;
class Loader extends \AppBase\Loader {}

Таким образом, при создании экземпляра класса AppExample\App будет вызываться переопределенный метод createLoader, который будет создавать экземпляр класса Loader из пространства имен AppExample.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир