Это базовый веб-сайт. Основываясь на ответах здесь, я делаю это:
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);