不同类中的PHP数据对象

不同类中的PHP数据对象,php,pdo,Php,Pdo,我使用继承连接到PDOPHP数据对象,首先让我向您展示我的DB.php代码 我已经使我的DB.php成为一个单例类。我对单例模式有很好的了解 我希望我的代码被分发和分离,因此我创建了一个全新的类,用于从数据库中选择数据 class DB { private $db = ""; private static $instance = null ; private function __construct() { try { //$dsn = "mys

我使用继承连接到PDOPHP数据对象,首先让我向您展示我的DB.php代码

我已经使我的DB.php成为一个单例类。我对单例模式有很好的了解

我希望我的代码被分发和分离,因此我创建了一个全新的类,用于从数据库中选择数据

class DB {
private $db = "";
private static $instance = null ;

    private function __construct() {
        try {
            //$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
            $this->db = new PDO("mysql:host=127.0.0.1;dbname=cactus", "root", "", $options = [
            PDO::ATTR_EMULATE_PREPARES   => false,
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
              ]);
        } catch(PDOException $e) {
            print("Error: " . $e->getMessage() . "<br>");
            die();
        }
}

    public function connect() {
        if(self::$instance == null) {
            self::$instance = new DB();
        }

        return self::$instance;
    }
}


<?php
include "DB.php";

class Load_Data {

    public function Fetch() {
        $db = DB::connect();
        $Querystatement = $this->db->prepare("SELECT * FROM `production`");
        $Querystatement->fetchAll();
        $Querystatement->execute();
        /** Converting data to JSON **/ 
        json_encode($Querystatement);
        return $Querystatement;
    }
}

$load_Data = new Load_Data();
$load_Data->Fetch();
下面是我的名为load-data.php的类,问题是在调用DB::connect时它给了我以下错误

错误是它无法识别DB::connect;。最终在prepare函数中也会出现错误

我哪里做错了?我应该做些什么来实现下面所需的代码

[注意]:我已经在STACKOVERFLOW和其他论坛上讨论过确切或类似的问题,但没有找到任何有帮助的方法。

您的第一个问题是:

$db = DB::connect();
^^^
$Querystatement = $this->db->…
                  ^^^^^^^^^
分配给$db将创建一个名为$db的局部变量。如果希望将此值作为实例变量$this->db使用,则需要显式地分配给该变量


第二个问题是DB对象不是PDO对象;您不能调用PDO方法,如prepare。由于db对象的db属性是私有的,因此无法从外部调用方访问它;您需要对设计进行一些更改。

我认为您的问题在于尚未将connect方法定义为静态方法。因此,无法通过调用DB:connect访问它

尝试将类的连接方法修改为以下内容:

public static function connect() {
    /* Existing Code Here */
}
编辑:

此外,我认为您需要将类中的$db属性设置为public而不是private,以确保Fetch方法中的本地$db变量具有调用\PDO方法的属性的可见性。

Change

$Querystatement = $this->db->prepare("SELECT * FROM `production`");


有几个问题。首先,为了使用继承,DB类必须扩展PDO。你说的对 构造函数应该是私有的,但实际上不应该包含任何内容。您的连接方法需要是静态的, 它需要调用另一个静态方法来获取实例,并且构造函数不能是静态的。因此,添加一个静态getInstance 方法,该方法设置并返回实例,并在connect中调用该实例,而不是尝试使用new

在修复Load_数据之后,如果您想查看任何内容,您仍然需要对使用它的方式再做一次调整。使命感 $load_Data->Fetch;不输出任何内容。Fetch现在将返回一个字符串,但如果需要,您需要回显它 查看结果,或者如果要对其执行其他操作,则将其分配给变量

<?php
$load_Data = new Load_Data();
echo $load_Data->Fetch();
// OR $json = $load_Data->Fetch();

事实上,这并不能解决我的问题,因为我的另一半错误将保留在它的位置。如下所示:致命错误:未捕获错误:调用未定义的方法DB::prepare in C:\xampp\htdocs\Cactus\load data.php:8堆栈跟踪:0 C:\xampp\htdocs\Cactus\Cactus\load-data.php18:load_data->Fetch 1{main}在第8行的C:\xampp\htdocs\Cactus\Cactus\load-data.php中抛出,换句话说,它仍然不承认DB::prepare方法是合法的方法。在您的建议后,我刚刚尝试了它,但它不起作用。只有当变量$DB直接包含PDO实例时,这才是正确的。在本例中,$db变量包含一个类引用,该类引用包含另一个变量$db,该变量包含PDO实例。现在的问题是,我试图实现的逻辑是否可以实现如果是的话,我至少需要一个如何实现的提示。@WajahatAli对答案进行了编辑。由于使用了private,您的内部db实例对本地$db变量不可见。公开它,它应该可以正常工作。您在哪里使用继承?您指的是这里没有显示的其他代码吗?先生,首先非常感谢您对我的答案的深入回答。这正是我想要的,但是您能告诉我如何在上面的场景中实例化insert函数吗。再次感谢你,先生。
<?php
class DB extends PDO {

    private static $instance = null ;

    private function __construct() { }

    private static function getInstance() {
        try {
            return self::$instance = new PDO("mysql:host=127.0.0.1;dbname=cactus", "root", "", [
                PDO::ATTR_EMULATE_PREPARES   => false,
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            ]);
        } catch (PDOException $e) {
            print("Error: " . $e->getMessage() . "<br>");
            die();
        }
    }

    public static function connect() {
        if (self::$instance == null) {
            self::$instance = self::getInstance();
        }
        return self::$instance;
    }
}
<?php

class Load_Data {

    public function Fetch() {
        $db = DB::connect();
        $Querystatement = $db->prepare("SELECT * FROM `production`");
        $Querystatement->execute();
        $result = $Querystatement->fetchAll();
        return json_encode($result);
    }
}
<?php
$load_Data = new Load_Data();
echo $load_Data->Fetch();
// OR $json = $load_Data->Fetch();