Как вызывать переопределенные классы внутри базового класса? Ситуация такая: есть два базовых класса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, и если он не найден - то вызывать из текущего. Может быть есть более стандартные решения этого вопроса?
В данной ситуации можно воспользоваться поздним статическим связыванием для создания экземпляра нужного класса 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.
В данной ситуации можно воспользоваться поздним статическим связыванием для создания экземпляра нужного класса 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.