Fatal error: Call to a member function prepare() in php oop

Fatal error: Call to a member function prepare() in php oop

现在我学习使用 OOP 概念创建 PHP crud 操作

在这段代码中我遇到了一些问题

Config.php

<?php
class Database{
    private $dbHost     = "localhost";
    private $dbUsername = "root";
    private $dbPassword = "";
    private $dbName     = "xtratuition";
    public $db;
    
    public function __construct(){
        if(!isset($this->db)){
            try{
                $conn = new PDO("mysql:host=".$this->dbHost.";dbname=".$this->dbName, $this->dbUsername, $this->dbPassword);
                $conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $this->db = $conn;
            }
            catch(PDOException $e){
                die("Failed to connect with MySQL: " . $e->getMessage());
            }
            return $this->db;
        }
    }
}
?>

Modules.php

<?php
include_once("config.php");

class CrudController extends Database{
    function sqlSelect($TblName , $Condition){
        try{
            $query = "SELECT * FROM `xtratuition`.$TblName WHERE $Condition";
            $result = $this->db->prepare($query);
            $result->execute();
            $data = array();
            while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
                $data[] = $row;
            }
            return $data;
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
    }
}
class LoginController extends CrudController{
    public $emailID;
    function __construct($email){
        $this->emailID = $email;
    }
    function userLogin(){
        $data = $this->sqlSelect("users" , "email = '".$this->emailID."'");
        return $data;
    }
}

// This is works well

// $login = new CrudController();
// $data = $login->sqlSelect("`users`" , "email = 'klakshmanan48@gmail.com'");
// print_r($data);


$login = new LoginController("klakshmanan48@gmail.com");
$data = $login->userLogin();
print_r($data);


?>

我想我在这段代码中犯了一个错误。 我收到了这个错误

Fatal error: Call to a member function prepare() on null

这条线

$result = $this->db->prepare($query);

如果您在子 class 中定义构造函数,则必须显式调用父构造函数,它们不会自动调用。

您必须在您的 LoginContoller 中调用父构造 class

class LoginController extends CrudController{
    public $emailID;
    function __construct($email){
        $this->emailID = $email;
        parent::__construct(); //explicit call to parent constructor
    }
    function userLogin(){
        $data = $this->sqlSelect("users" , "email = '".$this->emailID."'");
        return $data;
    }
}