Ситуация такая: есть два базовых класса
<?php
namespace AppBase;
class App
{
protected $loader;
public function __construct()
{
$this->loader = new Loader();
}
}
<?php
namespace AppBase;
class Loader {}
И есть наследуемые классы:
<?php
namespace AppExample;
class App extends \AppBase\App {}
<?php
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, и если он не найден - то вызывать из текущего.
Может быть есть более стандартные решения этого вопроса?