Php PDO对象为空

Php PDO对象为空,php,pdo,Php,Pdo,这是我的代码: class DB { static $instance; function get() { if (self::$instance === null) { self::$instance = new PDO('mysql:host=localhost;dbname=forum', 'root', 'root'); } return self::$instance; } function getAllUsers() { $user

这是我的代码:

class DB {
static $instance;

function get() {
    if (self::$instance === null) {
        self::$instance = new PDO('mysql:host=localhost;dbname=forum', 'root', 'root');
    }
    return self::$instance;
}

function getAllUsers() {
    $users = array();
    $sql = "SELECT * FROM users";
    foreach (self::get()->query($sql) as $row) {
        $users[] = new User($row);
    }
    return $users;    
}
}
现在我在这里调用getAllUsers函数:

class App {
function showUsers() {
    $users = DB::getAllUsers();
}
除了给我一个错误:

警告:为foreach()提供的参数无效

当我在
self::get上执行
var\u dump
时,我得到一个
bool(false)

有人能告诉我我做错了什么吗?

仅当对象成功地将查询发送到数据库并返回有效响应(即驱动程序没有返回SQL错误)时,才会返回对象。但是,如果失败,它将返回
false
。因此,为了处理错误,您必须对此进行检查。此外,您还可以选择在遇到错误时让它抛出异常。这样,无论何时调用PDO对象,都可以使用try/catch来处理错误。请参见下面的示例

使用PDO的默认错误模式(静默):

if ($result = self::get()->query($sql)) {
    /* Iterate here */
    foreach ($result as $row) {
        /* Do whatever you want with $row */
    }
} else {
    /* Handle errors here */
    echo "There was an error with the query!";
    var_dump(self::get()->errorInfo());
}
/* Put PDO Into Exception Mode */
self::get()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
    foreach (self::get()->query($sql) as $row) {
        /* Do whatever you want with $row */
    }
} catch(PDOException $e) {
    /* If PDO fails we handle it here */
    echo "Your query failed: " . $e->getMessage();
}
PDO处于异常模式时:

if ($result = self::get()->query($sql)) {
    /* Iterate here */
    foreach ($result as $row) {
        /* Do whatever you want with $row */
    }
} else {
    /* Handle errors here */
    echo "There was an error with the query!";
    var_dump(self::get()->errorInfo());
}
/* Put PDO Into Exception Mode */
self::get()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
    foreach (self::get()->query($sql) as $row) {
        /* Do whatever you want with $row */
    }
} catch(PDOException $e) {
    /* If PDO fails we handle it here */
    echo "Your query failed: " . $e->getMessage();
}

我想指出的是,var_dump(self::get())显示对象(PDO)#2(0){}为什么不显示?在这里,您不会给类任何失败的路径。如果您使用
self::get()
调用类实例,那么
get()
应该声明为
static
。我最初的想法是错误隐藏了,因为我还没有创建数据库。但是我用try/catch来包围它,它仍然没有给我一个PDO例外。这个类应该是静态的,是的,我很清楚这一点。但是由于某些原因,它仍然在没有static关键字的情况下工作。在前三条语句中,我得到了一个pdo对象。正是我的想法<代码>:)