$db =& new db();
Все прекрасно и замечательно, но меня корежит то что каждому классу, которому необходима работа с БД, приходится передавать ссылку на экземпляр класса скажем так:
private function __construct(&db) {
$this->db =& $db;
}
В общем удобства это не доставляло, зависимость кода только повышалась и вообще полная печаль.
В идеале хотелось что бы из любого места без всяких ссылок можно было сделать вызов метода класса вида
db::getRow();
. Это легко решалось бы использованием статических методов, однако при этом бы исчезло множество удобных вещей, в частности логирование и дебаг запросов.Дальше на ум конечно же приходит пресловутый паттерн Singlton который отчасти решал задачу позволяя делать запросы вида:
dh::getInstance()->getRow();
//OR
dh::instance->getRow();
Но тут меня понесло и я желая получить то что хотел родил это:
class db {
public $test_row = 'Work!';
public static $instance;
function __construct() { }
public static function __callStatic($name, $arguments) {
if(!self::$instance) self::getInstance();
$methodname = preg_replace('/\_?/', '', $name);
self::$instance->$methodname($arguments);
}
public static function getInstance() {
self::$instance = new db();
return self::$instance;
}
public function getRow () {
return $this->test_row;
}
}
echo db::_getRow(); //Выведет 'Work!'
В общем получилось то что хотел, к методам можно обращаться либо через экземпляр класса, либо как к статическим (через '_'), при этом не теряя указателя $this. Но все это изрядно попахивает и отнюдь не цветочками.
Собственно вопрос:
Есть у кого то адекватная реализация, балансирующая между удобством и здравым смыслом?