Если у меня есть 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->
Я был бы очень благодарен, если бы кто-то мог объяснить мне это немного лучше. Я знаю о видимости переменных и много об этом читал, но думаю, что сейчас не понимаю, иначе у меня не было бы этой проблемы.
Спасибо за каждый совет! :)