Я часто использую шаблон реестра, где также происходит такое поведение. Я всегда устанавливаю переменную экземпляра в конструкторе моих моделей, чтобы указывать на запись реестра;
class Registry {
private static $_instance;
private $_registry;
private function __construct() {
$_registry = array();
}
public static function getInstance() {
if (!Registry::$_instance) {
Registry::$_instance = new Registry();
}
return Registry::$_instance;
}
public function add($key, &$entry) {
$this->_registry[$key] = &$entry;
}
public function &get($key) {
return $this->_registry[$key];
}
public function has($key) {
return ($this->get($key) !== null);
}
}
Пример модели;
class MyModel {
private $_db;
public function __construct() {
$this->_db = Registry::getInstance()->get('dbKey');
}
/* Every function has now access to the DAL */
}
Пример использования;
$dal = new Db(...);
Registry::getInstance()->add('dbKey', $dal);
...
$model = new MyModel();
$model->doDbStuff();
Другой подход - всегда передавать ссылку в качестве параметра каждому конструктору.
Конечно, я использую это поведение только тогда, когда большинство методов в моей модели используют ссылку. Если только несколько (один или два) метода используют ссылку, я вызываю Registry / Singleton, как вы показали.