Php PDO类不工作-调用成员函数prepare

Php PDO类不工作-调用成员函数prepare,php,pdo,Php,Pdo,我有一个关于我的PDO课程的问题。它不工作,并创建了此错误:“注意:未定义变量:第21行classes.php中的db致命错误:在第32行classes.php中的非对象上调用成员函数prepare()。我试图修复此代码几个小时,但没有发现错误。非常感谢您的帮助 先谢谢你 <? // classes.php class Connection{ public static $db; function __construct() { try {

我有一个关于我的PDO课程的问题。它不工作,并创建了此错误:“注意:未定义变量:第21行classes.php中的db致命错误:在第32行classes.php中的非对象上调用成员函数prepare()。我试图修复此代码几个小时,但没有发现错误。非常感谢您的帮助

先谢谢你

<?
// classes.php

class Connection{

    public static $db;

    function __construct() 
    {
        try {
            $this->$db = new PDO('mysql:host=localhost;dbname=vnm', '--', '--', array(PDO::ATTR_PERSISTENT => true));
            $this->$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            echo 'Connection failed: ' . $e->getMessage();
        }   
    }

    public function GetAccess()
    {
        return $db;
    }

}

class Page
{
    public function show_page($s_p1)
    {
         $db = Connection::GetAccess();
         $id = "1";
         $stmt = $db->prepare('SELECT * FROM users WHERE id = :id');
         $stmt->execute();
         while($row = $stmt->fetch())
         {
             print_r($row);
         }
    }
}?>

必须使用
静态::
访问静态成员。当您应该使用
静态::$db
时,您直接访问代码中的
$db
,并且错误地使用了
$this->db
。您还需要将
GetAccess
声明为
公共静态函数

另外,调用
Connection::GetAccess
实际上并不会实例化该类,因此
static::$db
可能会为空,除非您在其他地方创建单例实例


你可以在这里阅读更多关于单例的内容:

试试这个。我删除了所有静态方法

    <?
// classes.php

class Connection{

    public $db;

    function __construct() 
    {
        try {
            $this->$db = new PDO('mysql:host=localhost;dbname=vnm', '--', '--', array(PDO::ATTR_PERSISTENT => true));
            $this->$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            echo 'Connection failed: ' . $e->getMessage();
        }   
    }

    public function GetAccess()
    {
        return $this->$db;
    }

}

class Page
{
    public function show_page($s_p1)
    {
         $con = new Connection();
         $db = $con->GetAccess();
         $id = "1";
         $stmt = $db->prepare('SELECT * FROM users WHERE id = :id');
         $stmt->execute();
         while($row = $stmt->fetch())
         {
             print_r($row);
         }
    }
}?>

谢谢您的回答。您的提示对我没有帮助,它仍然导致了这个错误。似乎在编写这样的代码之前,我必须获得更多的理论知识。