Если у меня есть 3 объекта, которые совместно используют одно и то же соединение БД в одной итерации, это плохо?

аю, у меня проблема с пониманием того, как работает ООП. Я уже изменил код, чтобы он работал, но я думаю, что это не лучший способ. Следующий сценарий (Нет, я не создаю userlogin самостоятельно, его просто для локального разработчика, чтобы лучше понять ООП):

У меня есть файл database.php:

class Database {

    /* Properties */
    private $conn;
    private $dsn = 'mysql:dbname=test;host=127.0.0.1';
    private $user = 'root';
    private $password = '';

    /* Creates database connection */
    public function __construct() {
        try {
            $this->conn = new PDO($this->dsn, $this->user, $this->password);
        } catch (PDOException $e) {
            print "Error!: " . $e->getMessage() . "";
            die();
        }
        return $this->conn;
    }
}

Итак, в этом классе я создаю соединение с базой данных и возвращаю соединение (объект?)

Затем у меня есть второй класс, известный класс User (на самом деле я не использую автозагрузку, но я знаю об этом):

include "database.php";

class User {
    /* Properties */
    private $conn;

    /* Get database access */
    public function __construct() {
        $this->conn = new Database();
    }

    /* Login a user */
    public function login() {
        $stmt = $this->conn->prepare("SELECT username, usermail FROM user");
        if($stmt->execute()) {
            while($rows = $stmt->fetch()) {
                $fetch[] = $rows;
            }
            return $fetch;
        }
        else {
            return false;
        }
    }
}

Так что это мои два занятия. Ничего большого, как видите. Теперь не запутайтесь насчет названия функцииlogin - На самом деле я просто пытаюсь выбрать некоторые имена пользователей и почтовые сообщения из базы данных и отображать их. Я пытаюсь достичь этого путем:

$user = new User();
$list = $user->login();

foreach($list as $test) {
    echo $test["username"];
}

И тут возникает проблема. Когда я выполняю этот код, я получаю следующее сообщение об ошибке:

Uncaught Error: вызов неопределенного метода Database :: prepare ()

И я не уверен, что я действительно понимаю, что вызывает эту ошибку.

Код работает хорошо, когда я меняю следующие вещи:

+ Изменить$conn в database.php для public вместо private (я думаю, что это плохо ...? Но когда он закрыт, я могу выполнять запросы только внутри класса Database, я прав? Так что я должен поместить все эти запросы в класс Database «Я думаю, это плохо, потому что в большом проекте он станет действительно большим ..)

И второе изменение, которое я должен сделать:$this->conn->prepare в$this->conn->conn->prepare в файле user.php. И здесь я действительно понятия не имею, почему.

Я имею в виду, в конструкторе user.php у меня есть$this->conn = new Database() и так как новая база данных вернет мне объект подключения из класса БД, я действительно не знаю, почему должен быть второйconn->

Я был бы очень благодарен, если бы кто-то мог объяснить мне это немного лучше. Я знаю о видимости переменных и много об этом читал, но думаю, что сейчас не понимаю, иначе у меня не было бы этой проблемы.

Спасибо за каждый совет! :)