[英](PHP) Singleton Database Class - what about static methods?
这是一个基本的网站。 根据这里的答案,我这样做:
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();
编辑:使变量静态不能解决问题。 Access to undeclared static property
。 我仍然需要在静态函数中分配变量。 问题是询问是否有解决方法。
我的数据库类(虽然对此讨论不重要):
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(谢谢)注释,您可以使用self::
访问静态变量:
self::$db = Db::getInstance();
您已经概述了在一个类中混合静态方法时遇到的问题之一,这些方法也可以通过实例化来设置成员变量,并期望通过静态方法调用访问它们的值。 唯一真正的方法是为数据库单例设置特定于类的单例,或者将DB对象传递给静态方法。
// 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.