Поскольку вы еще не предоставили никакого кода, это слепое предложение о том, как можно удалить наследование с помощью очень небольшого кода, в то же время поддерживая полную функциональность и следя за тем, чтобы класс MDB создавался только один раз.
class Db
{
protected static $_mdb;
public function __construct()
{
if(self::_mdb === NULL) {
self::_mdb = new MDB;
}
}
public function __call($method, $args)
{
return call_user_func_array(array(self::_mdb, $method), $args);
}
}
Это в основном сделает ваш класс DB декоратором для MDB.При первом создании класс DB создаст и сохранит статический экземпляр MDB.Это будет использоваться всеми экземплярами БД, включая дочерние классы.Здесь нет причин использовать Singleton.
Перехватчик __call
обеспечит перехват всех методов, которые вы вызывали в DB и которые вызывают методы для метода MDB, и делегирование экземпляру MDB.Магические методы могут сильно повлиять на производительность, поэтому, когда вы заметите какое-либо влияние на производительность, добавьте все вызываемые методы в класс DB и делегируйте оттуда.
Нет необходимости говорить, что это все еще не лучшее решение, потому что вашеЭкземпляр БД все еще тесно связан с вашими модельными классами.Если вы можете позволить себе больше рефакторинга, я бы посоветовал сделать так, чтобы все классы, которые в настоящее время наследуются от БД, инкапсулировали экземпляр БД (если они не ActiveRecords).Затем используйте Dependency Injection, чтобы сделать экземпляр БД доступным.