未定义的方法,在类外使用PDO

时间:2016-12-23 21:00:14

标签: php class pdo namespaces

尝试在连接类之外运行查询时出现以下错误。

  

致命错误:在...中调用未定义的方法Core \ Database :: query()

我有以下文件。

database.php中

namespace Core;

use \PDO;

class Database
{
    private $pdo;
    private static $instance;

    private function __construct()
    {
        try {
            $this->pdo = new PDO("mysql:host=localhost;dbname=db;", "root", "pw");
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (\PDOException $e) {
            echo $e->getMessage();
        }
    }

    public static function getInstance()
    {
        if (!isset(self::$instance))
            self::$instance = new Database();
        return self::$instance;
    }
}

Auth.php

namespace Auth;

use Core\Database;

class Auth
{
    protected $dbh;

    public function __construct()
    {
        $this->dbh = Database::getInstance();
        $query = $this->dbh->query("SELECT * FROM table");
    }
}

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您正在设置数据库类的属性并返回静态值。也许你可能想要这样做:

class Database extends \PDO{
  public static function getInstance(){
    if(!self::$instance){
      self::$instance = new self();
    }
    return self::$instance;
  }

  public function __construct(){
    try {
        parent::__construct("mysql:host=localhost;dbname=db;", "root", "pw", [
          \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
        ]);

        self::$instance = $this;
    } catch (\PDOException $e) {
        echo $e->getMessage();
    }
  }
}

我个人已经这样做了,而不是创建一个愚蠢的包装类。

否则你必须改为设置静态变量:

self::$instance = new PDO("mysql:host=localhost;dbname=db;", "root", "pw");

答案 1 :(得分:0)

您在Auth课程中所做的是,您刚刚使用Database模式创建了Singleton类的实例,并尝试从query方法调用Database未在类中定义的$this->dbh->query()实例。如果要像Database那样访问它,则需要构造PDO类的实例并同时返回public static function getInstance() { if (!isset(self::$instance)) self::$instance = new Database(); return self::$instance->pdo; } 实例。像这样:

return self::$instance->pdo

我刚才修改的内容是PDO。如果第一次调用Database,则在getInstance类被实例化时返回PDO对象,否则它只返回创建的$this->dbh->query()实例。您现在可以在Auth课程中执行Database

注意,只有当您不在static类中定义除getInstance之类的getInstance方法以外的任何其他方法时,才需要执行此操作。因为PDO的结果只允许您访问public属性和方法。因此,解决方案是在Database中定义PDO方法,该方法分别返回public static function getInstance() { if (!isset(self::$instance)) self::$instance = new Database(); return self::$instance; } public function getPDO() { return $this->pdo; } 个实例。

PDO

完成后,您可以访问Auth课程中的public function __construct() { $this->dbh = Database::getInstance()->getPDO(); $query = $this->dbh->query("SELECT * FROM table"); } ,例如:

 <uses-permission android:name="android.permission.VIBRATE" />

希望它有所帮助!