静态和非静态工作方法


static and non static method to work

我想通过PDO以静态方式访问连接数据库,但仍然遇到错误。这是我的代码:

require_once 'include/class.Settings.php';
class MonthlySums{
    protected static $dbh;
    public function __construct() {
        $user = Settings::$db['user'];
        $pass = Settings::$db['password'];
        $dsn = 'mysql:host=' . Settings::$db['host'] . ';dbname=' . Settings::$db['db'];
        try {
            self::$dbh = new PDO($dsn, $user, $pass);
        } catch(PDOException $e) {
            die("Error! : " . $e->getMessage());
        }
    }
    public static function get($init_id) {
        $sql = "SELECT `year`, `month`, `gains_monthly_sum` FROM `fxs_gain_sums` WHERE `init_id` = '$init_id'";
        $resultats = MonthlySums::$dbh->query($sql);
        var_dump($resultats);
    }
}

我有这个错误:

Fatal error: Call to a member function query() on a non-object in /home/public_html/gainlosssums.php on line 45

那条线是:$resultats = MonthlySums::$dbh->query($sql);

如何使其以静态方式工作?

当您在类中调用静态方法时,构造函数不会像创建类的实例那样自动调用。使用代码时,您必须至少创建一个类的实例,以便在静态变量中设置数据库连接。然后你就可以用你想要的静态方式来调用它了。

如果你仍然想继续使用你的代码,你可以将其更改为:

请注意:这是OP修改的代码,我不讨论其他方面-只是OP问题的结果)

require_once 'include/class.Settings.php';
class MonthlySums{
    protected static $dbh;
    public function __construct() {
        $this->databaseLogin();
    }
    public static function databaseLogin(){
        $user = Settings::$db['user'];
        $pass = Settings::$db['password'];
        $dsn = 'mysql:host=' . Settings::$db['host'] . ';dbname=' . Settings::$db['db'];
        try {
            self::$dbh = new PDO($dsn, $user, $pass);
        } catch(PDOException $e) {
            die("Error! : " . $e->getMessage());
        }
    }
    public static function get($init_id) {
        $sql = "SELECT `year`, `month`, `gains_monthly_sum` FROM `fxs_gain_sums` WHERE `init_id` = '$init_id'";
        $resultats = self::$dbh->query($sql);
        var_dump($resultats);
    }
}
MonthlySums::databaseLogin();

正如您所看到的,有一个新的静态方法databaseLogin,它是在类声明之后立即调用的。这样就可以设置数据库连接的静态变量,并且可以在其他方法中使用。

你现在可以这样称呼它:

MonthlySums::get(1234);

同样,这可能不是最佳实践,但可以解决您的问题。