【问题标题】:Why does this come up as non-object?为什么这会作为非对象出现?
【发布时间】:2016-02-25 18:10:51
【问题描述】:

我正在尝试在 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;
        }           
    }   
}

我不知道我做错了什么,如果有任何关于如何完成这项工作的建议,我将不胜感激。

【问题讨论】:

  • @AbraCadaver 哎呀,你是对的。
  • 1.你怎么打电话给$db 2.你测试过确保连接成功了吗? 3. 在你的子类中你调用了父类的构造函数吗?
  • @AbraCadaver 我将另一个类中的 $db 称为 $this->db 因为我已经扩展了它。我确信连接一定是成功的,因为我在尝试解决问题时已经对其进行了测试。
  • 发布子类的构造函数。
  • @AbraCadaver 我更新了我的帖子。

标签: php oop pdo


【解决方案1】:

对于问题,如果子类中有__construct()方法,那么你需要显式调用父类的__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

【讨论】:

    【解决方案2】:

    您一开始就不应该从数据库类扩展应用程序类。

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

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

    关于“接受”的答案,这是错误的。只要在定义的子类中没有构造函数(就像在 OP 中一样),就使用父 counstructor。欢迎使用 Stack Overfraud。

    【讨论】:

    • 我已经编辑过,但没有错。不管有没有显示,显然他们在子类中有一个构造函数。
    猜你喜欢
    • 2018-02-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2013-01-29
    • 2019-09-17
    相关资源
    最近更新 更多