PHP:尝试对数据库使用后期静态绑定(LSB)。也许我对LSB的理解是错误的

PHP:尝试对数据库使用后期静态绑定(LSB)。也许我对LSB的理解是错误的,php,database,Php,Database,我多年来一直在创建PHP项目,并且以前编写过静态调用和创建的数据库类,即: class Database { private static $objConnection; public static function connect() { self::$objConnection = @mysqli_connect(/* Username, password, etc */); // Do connection checking etc...

我多年来一直在创建PHP项目,并且以前编写过静态调用和创建的数据库类,即:

class Database {
    private static $objConnection;

    public static function connect() {
        self::$objConnection = @mysqli_connect(/* Username, password, etc */);

        // Do connection checking etc....
    }
    public static function get_row($strSQL) {/*Do Stuff here*/};
    public static function get_rows($strSQL) {/*Do Stuff here*/};
}
然后,我可以在代码中使用方法调用:$objResult=Database::get_rows('SELECT*FROM User');比如说

我现在需要多个数据库(即,一个项目需要多个数据库),因此希望扩展一个基本数据库类,然后将其扩展到具有不同设置的不同数据库,这样就不必每次使用新数据库时都重新编写大约20个静态调用。因此,我想在代码中调用:maindabase::get_rows($strSQL);,和UserDatabase::get_rows($strSQL);例如,对于用户数据库。我以前读过LSB,认为这可以让我这么做,但我一直坚持5.30之前的版本,直到现在!我使用LSB实现了这个系统,但遇到了问题。以下是我的代码的基础(删除了很多细节):

例如,如果从index.php调用和测试,而不是在类中调用和测试,则这种方法是有效的。问题是当我在另一个类中调用MainDatabase和UserDatabase::run_query时。例如:

class User {
    public function load($idUser) {
        $objRow = UserDatabase::run_query('SELECT * FROM User WHERE idUser = $idUser');
    }
}
如果我在User类上调用load方法,那么我会得到错误:“致命错误:访问未声明的静态属性:User::$objConnection in DatabaseBase.php,在xx行”

如果我在run_query()方法中输出get_called_class()的结果,它也会显示User

用户无论如何都不会扩展数据库,并且不是静态的。也许这就是我对LSB的理解,但有人能帮我吗。我的DatabaseBase类将定义许多可用于数据库连接的静态方法,子类将只包含静态连接对象和连接/设置信息。我对此感到有点失望,因为我已经等了6个月尝试LSB作为解决方案,发现这不是我想要的


关于Gunja,如果运行UserDatabase::connect(),它应该存储来自

static::$objConnection = @mysqli_connect(/*Users, pass, etc*/);
实际上是在UserDatabase类中(而不是在DatabaseBase类中)。那么


应该可以工作,但是您可能也希望使run\u查询成为静态的

如果运行UserDatabase::connect(),它应该存储来自的objConnection

static::$objConnection = @mysqli_connect(/*Users, pass, etc*/);
实际上是在UserDatabase类中(而不是在DatabaseBase类中)。那么


应该可以工作,但是您可能也希望使run\u查询成为静态的

这页上的“fchoquet at NOSPAM.example.com 25-Oct-2011 06:36”的评论:(),实际上似乎显示了相同的问题,我认为:这页上的“fchoquet at NOSPAM.example.com 25-Oct-2011 06:36”的评论:(),实际上似乎显示了相同的问题,我认为:啊!!!在我的“真实”代码中,run\u查询是静态的,但connect不是。实际上,我在数据库中的函数中遗漏了几个静态关键字!非常感谢你。因此,我确实了解LSB的工作,但在实现过程中犯了错误!在周末花了很多时间来实现这个,然后昨晚非常沮丧地上床睡觉,因为没有按预期工作。谢谢,谢谢!!现在继续!我很高兴能帮上忙!:)祝所有进一步编码好运,LSB确实非常有用!:)啊哈!!!在我的“真实”代码中,run\u查询是静态的,但connect不是。实际上,我在数据库中的函数中遗漏了几个静态关键字!非常感谢你。因此,我确实了解LSB的工作,但在实现过程中犯了错误!在周末花了很多时间来实现这个,然后昨晚非常沮丧地上床睡觉,因为没有按预期工作。谢谢,谢谢!!现在继续!我很高兴能帮上忙!:)祝所有进一步编码好运,LSB确实非常有用!:)
UserDatabase::run_query('SELECT * FROM User WHERE idUser = $idUser');