Есть 2 класса:
namespace A;
class AClass {
function create() {
return new Test(); // по идее тут создается объект класс \A\Test()
}
}
Второй класс:
namespace B;
class BClass extends \A\AClass {
// мы унаследовали метод create(), но он все равно вернет
// нам объект класса \A\Test
// Как наиболее правильно и гибко реализовать, чтобы метод
// create в классе BClass возвращал объект класса \B\Test,
// с минимальным кодом в классе BClass
}
При этом важно, не переопределять метод create в классе BClass Спасибо.
Предложу пару вариантов.
Вариант №1 - задавать имя создаваемого класса в виде protected члена класса, перекрывая его в наследниках.
namespace A {
class AClass {
protected $cls = "\\A\\Test";
function create() {
return new $this->cls;
}
}
class Test {}
}
namespace B {
class BClass extends \A\AClass{
protected $cls = "\\B\\Test";
}
class Test {}
}
Вариант №2. Извлекать полное имя класса во время выполнения с помощью static, и заменять имя класса, оставляя namespace.
function create() {
$cls = preg_replace("/(.+)\\\(\w+?)$/", "$1\\Test", static::class);
return new $cls;
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости