How can OOP principles be applied effectively when working with MySQL queries in PHP classes?

When working with MySQL queries in PHP classes, OOP principles can be applied effectively by encapsulating the database connection and query execution within methods of a dedicated database class. This class can handle tasks such as connecting to the database, preparing and executing queries, and fetching results in a structured manner. By using OOP principles like encapsulation, inheritance, and abstraction, the code becomes more organized, reusable, and easier to maintain.

<?php

class Database {
    private $connection;

    public function __construct($host, $username, $password, $database) {
        $this->connection = new mysqli($host, $username, $password, $database);
        if ($this->connection->connect_error) {
            die("Connection failed: " . $this->connection->connect_error);
        }
    }

    public function query($sql) {
        $result = $this->connection->query($sql);
        if ($result === false) {
            die("Query failed: " . $this->connection->error);
        }
        return $result;
    }

    public function fetch($result) {
        return $result->fetch_assoc();
    }

    public function close() {
        $this->connection->close();
    }
}

// Example of using the Database class
$db = new Database("localhost", "username", "password", "database_name");
$result = $db->query("SELECT * FROM users");
while ($row = $db->fetch($result)) {
    echo $row['username'] . "<br>";
}
$db->close();

?>