工作的静态和非静态方法

时间:2016-04-15 10:04:35

标签: php class oop pdo static-methods

我想以静态方式通过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);

如何让它以静态方式工作?

1 个答案:

答案 0 :(得分:1)

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

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

请注意:这是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);

同样,这可能不是最佳做法,而是解决您的问题。