(PHP) Singleton Database Class – как насчет статических методов?

Это базовый веб-сайт. Основываясь на ответах здесь, я делаю это:

private $db; public function __construct($id = null) { $this->db = Db::getInstance(); //singleton from the Db class 

Но если есть статический метод, я не могу использовать переменную объекта.

Есть ли что-то лучше, чем вручную указывать переменную db внутри статического метода?

 public static function someFunction($theID){ $db = Db::getInstance(); 

EDIT: Создание переменной static не решает проблему. Access to undeclared static property . Мне все равно придется назначать переменную в статической функции. Вопрос заключается в том, есть ли способ обойти это.

Мой класс DB (хотя это не важно для обсуждения):

 class Db { private static $m_pInstance; private function __construct() { ... } public static function getInstance(){ if (!self::$m_pInstance) self::$m_pInstance = new Db(); return self::$m_pInstance; } 

}

Да, вы можете сделать статический $db :

 static private $db; 

Я предполагаю, что это то, что вам нужно, поскольку вы обращаетесь к нему со static метода. Если есть какая-то причина, по которой вы не захотите этого, это должно означать, что метод, вероятно, не должен быть static .

РЕДАКТИРОВАТЬ:

По комментариям @zerkms (thanks) вы получаете доступ к статическим переменным с помощью self:: :::

 self::$db = Db::getInstance(); 

Вы изложили одну из проблем, с которыми сталкиваетесь при совместном смешивании статических методов внутри класса, которые также могут быть надуманными, устанавливая переменные-члены посредством создания экземпляров и ожидая доступа к их значениям посредством статического вызова метода. Единственный реальный путь вокруг этого – установить одиночный одноклассник для одиночной базы данных или передать объект БД статическому методу.

 // Option 1 class MyClass { private static $db; public function __construct($id = null) { self::$db = Db::getInstance(); //singleton from the Db class } public static function someFunction($theID) { self::$db->query('SELECT * FROM my_table'); } } // Singleton DB for MyClass will be initalized via constructor $myClass = new MyClass(); // This call will have access to DB object set via class specific singleton MyClass::someFunction(4); // Option 2 class MyClass { private $db; public function __construct($id = null) { $this->$db = Db::getInstance(); //singleton from the Db class if (!is_null($id)) { $this->id = $id; } } public function getDb() { return $this->db; } public function getId() { return $this->id; } // Sub-Option 1: If Id ISNT set via object public static function someFunction($object, $theID) { $object->getDb()->query('SELECT * FROM my_table WHERE id = ' . (int) $theID); } // Sub-Option 2: If Id IS set via object public static function someFunction($object) { $object->getDb()->query('SELECT * FROM my_table WHERE id = ' . (int) $object->getId()); } } // Sub-Option 1 call $myClass = new MyClass(); MyClass::someFunction($myClass, 4); // Sub-Option 2 call $myClass = new MyClass(4); MyClass::someFunction($myclass);