Как вызывать переопределенные классы внутри базового класса?

Ситуация такая: есть два базовых класса
<?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, и если он не найден - то вызывать из текущего.

Может быть есть более стандартные решения этого вопроса?
  • Вопрос задан
  • 430 просмотров
Пригласить эксперта
Ответы на вопрос 2
error500
@error500
PHP-developer
Не понимаю зачем вам такое решение, но все же можно попробовать так
namespace AppBase;
class App
{
    protected $loader;

    public function __construct()
    {
        	$reflectionClass = new \ReflectionClass($this);
    	    $namespace = $reflectionClass->getNamespaceName(); //AppExample
    	    echo $namespace;
       /*Логика*/
    }
    
}
namespace AppBase;
class Loader {}
namespace AppExample;
class App extends \AppBase\App {}
namespace AppExample;
class Loader extends \AppBase\Loader {}

$app = new \AppExample\App();
Ответ написан
rdifb0
@rdifb0
Программист, реалист
А если так
class App {
	    protected $loader;
	
	    public function __construct(ILoader $loader)
	    {
	        $this->loader = $loader;
	    }
	    
	}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы