Лучший способ построить расширяемую систему

Я занимаюсь разработкой PHP CMS и у меня возник вопрос о гибкой и «расширяемой» архитектуре.

Я хочу позволить пользователям «расширять» каждый класс в системе.
Например, если у меня есть класс User:

<?php
namespace MyCMSName\Extensions\Users;

class User
{
public function getUserAvatar()
{
// return file path, for example
}
}

Теперь я хочу сделать что-то с пользователями аватаров. Например, вернуть разные изображения для каждого пользователя.

<?php
namespace MyCMSName\Extensions\FakeUserAvatars;

class User extends MyCMSName\Extensions\Users\User
{
public function getUserAvatar()
{
// return another path
}
}

Но где-то в системе у меня есть пользовательский объект конструирования. Мне нужно создать FakeUserAvatars\User, не оригинал Users\User объект.

...
$user = new (? How can I determine which class to construct?)

Должен ли я создать что-то для карты «оригинальный класс → расширенный класс», а затем сгенерировать это при установке новых расширений? Затем я могу получить класс, который перегрузит оригинал и создать новый экземпляр. Но как насчет автозагрузки? Кажется, у меня должна быть пользовательская функция для загрузки каждого класса в системе, если я хочу сделать его «расширяемым».

Как вы думаете?
Извините, если я написал что-то не так, английский не мой родной язык …

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …