Php 为什么这会成为非对象?

Php 为什么这会成为非对象?,php,oop,pdo,Php,Oop,Pdo,我试图用PHP创建一个非常简单的数据库连接类,但遇到了一些问题 首先,这是我写的代码: class db { protected $db; public function __construct() { $this->db = new PDO('mysql:host=127.0.0.1;dbname=main', 'root', ''); } } 每当我试图从扩展我的数据库类的另一个类调用$db时,我都会遇到如下错误: 致命错误:对class

我试图用PHP创建一个非常简单的数据库连接类,但遇到了一些问题

首先,这是我写的代码:

class db {

    protected $db;

    public function __construct() {

        $this->db = new PDO('mysql:host=127.0.0.1;dbname=main', 'root', '');
    }
}
每当我试图从扩展我的数据库类的另一个类调用
$db
时,我都会遇到如下错误:

致命错误:对class.php中的非对象调用成员函数prepare()

我在另一个类中调用数据库链接,如以下示例所示:

class example extends db {  

    public function challenge_exists($challenge) {

        $query = $this->db->prepare('SELECT * FROM challenges WHERE challenge = :challenge');
        $query->bindParam(':challenge', $challenge, PDO::PARAM_STR);
        $query->execute();

        if($query->rowCount() > 0) {
            return true;
        }           
    }   
}

我不知道我做错了什么,如果您能给我一些建议,我将不胜感激。

对于这个问题,如果子类中有
\uu construct()
方法,那么您需要显式调用父类的
\uu construct()
,否则它不会被执行,
$db
永远不会被实例化。虽然在示例代码中没有显示子构造函数,但可以安全地假设存在一个基于行为的子构造函数,因此:

class example extends db {

    public function __construct() {    
        parent::__construct();
        //more stuff   
    }
}
如果在子类中不需要构造函数,请将其删除,并且在实例化子类的对象时将调用父构造函数

至于设计,这是不好的,你应该考虑一个数据库对象,并将其注入需要它的对象或类似的方法:

class example {

    public function __construct($db) {
        $this->db = $db;
    }
}

$db = new db();              // do this once
$example = new example($db); // inject when needed

您不应该首先从数据库类扩展应用程序类

用户不是数据库。它是一个用户。他们没有共同之处。数据库必须由用户作为服务使用,而不是父级

更不用说从同一个脚本创建100个连接是一个非常糟糕的主意


关于“被接受”的答案,这是错误的。只要定义的子类(如OP中)中没有构造函数,就使用父constructor。欢迎来到Stack Overfraud。

@Abracadver Oops,你说得对。1。如何调用
$db
2。您是否进行了测试以确保连接成功?3.在您的子类中,您是否调用了父构造函数?@AbraCadaver我将另一个类中的$db调用为$this->db,因为我已经扩展了它。我确信连接一定会成功,因为我在尝试解决问题时已对其进行了测试。发布子类的构造函数。@abracadver我更新了我的帖子。我已编辑,但没有错。无论是否显示,很明显,他们在子类中有一个构造函数。