ООП — команды sql внутри класса PHP

У меня есть веб-сайт, написанный на процедурном PHP, и теперь я перекодирую его в (по крайней мере частично) стиле ООП, чтобы начать его изучение. Это простая страница, отображающая несколько учебных курсов (название, описание и т. Д.) Из базы данных. Администратор может добавлять или удалять что угодно, поэтому оно должно быть динамичным.
Сначала я запустил одну строку кода:

    $courses=$pdo->run("SELECT id,title,description FROM courses WHERE status=1 ORDER BY id")->fetchAll(PDO::FETCH_CLASS, 'Course');
$cmax = count($courses);

и повторил, например, $courses[3]->description но я чувствовал, что ничего не делаю, кроме притворства ООП, просто используя многомерный массив. Опять же, это было бы нормально для целей веб-сайта, но мой вопрос, чтобы привыкнуть к логике ООП, могу ли я сделать это так: я создаю выпадающее меню только с заголовками и идентификаторами из базы данных, и после того, как кто-то нажал, только тогда я создаю объект (чтобы получить описание, дату, учителя, что угодно):

$obj = new Course($pdo,$userSelectedID);
echo $obj->getTitle($pdo);
$obj->showDetails($pdo); // etc

Класс:

class Course {

protected $id;
protected $title;
protected $description;

public function __construct($pdo,$id) {
$this->id=$id;
}

public function getTitle($pdo) {
$this->title=$pdo->run("SELECT title FROM courses WHERE id=?",[$this->id])->fetchColumn();
return $this->title;
}

public function getDescription($pdo) {
$this->description=$pdo->run("SELECT description FROM courses WHERE id=?",[$this->id])->fetchColumn();
return $this->description;
}

public function showDetails($pdo) {
echo "<h3>".$this->getTitle($pdo)."</h3>".$this->getDescription($pdo);
}

}

Это неправильный подход? Можно ли запускать команды sql внутри класса? Особенно, когда мне уже приходилось использовать некоторые данные БД для создания выпадающего меню. Я надеюсь, что мой вопрос имеет смысл.

PS: я слышал, что передача объекта PDO каждый раз не лучшая практика, но я пока не готов сделать это с рекомендованным экземпляром (?)

1

Решение

У меня есть веб-сайт, написанный на процедурном PHP, и теперь я перекодирую его в (по крайней мере частично) стиле ООП, чтобы начать его изучение. Это простая страница, отображающая несколько учебных курсов (название, описание и т. Д.) Из базы данных. Администратор может добавлять или удалять что угодно, поэтому оно должно быть динамичным.
Сначала я запустил одну строку кода:

    $courses=$pdo->run("SELECT id,title,description FROM courses WHERE status=1 ORDER BY id")->fetchAll(PDO::FETCH_CLASS, 'Course');
$cmax = count($courses);

и повторил, например, $courses[3]->description но я чувствовал, что ничего не делаю, кроме притворства ООП, просто используя многомерный массив. Опять же, это было бы нормально для целей веб-сайта, но мой вопрос, чтобы привыкнуть к логике ООП, могу ли я сделать это так: я создаю выпадающее меню только с заголовками и идентификаторами из базы данных, и после того, как кто-то нажал, только тогда я создаю объект (чтобы получить описание, дату, учителя, что угодно):

$obj = new Course($pdo,$userSelectedID);
echo $obj->getTitle($pdo);
$obj->showDetails($pdo); // etc

Класс:

class Course {

protected $id;
protected $title;
protected $description;

public function __construct($pdo,$id) {
$this->id=$id;
}

public function getTitle($pdo) {
$this->title=$pdo->run("SELECT title FROM courses WHERE id=?",[$this->id])->fetchColumn();
return $this->title;
}

public function getDescription($pdo) {
$this->description=$pdo->run("SELECT description FROM courses WHERE id=?",[$this->id])->fetchColumn();
return $this->description;
}

public function showDetails($pdo) {
echo "<h3>".$this->getTitle($pdo)."</h3>".$this->getDescription($pdo);
}

}

Это неправильный подход? Можно ли запускать команды sql внутри класса? Особенно, когда мне уже приходилось использовать некоторые данные БД для создания выпадающего меню. Я надеюсь, что мой вопрос имеет смысл.

PS: я слышал, что передача объекта PDO каждый раз не лучшая практика, но я пока не готов сделать это с рекомендованным экземпляром (?)

самый старый «data-shortcut =» O

Другие решения

Хорошим подходом является создание классов моделей для каждой таблицы в вашей базе данных.
Модель содержит приватные атрибуты, соответствующие вашим столбцам таблицы, со связанными получателями и установщиками.
Для таблицы курса:

class Course {

protected $id;
protected $title;
protected $description;

public function getId() {
return $this->id;
}

public function setId($id) {
$this->id = $id;
}

public function getTitle() {
return $this->title;
}

public function setTitle($title) {
$this->title = $title;
}

public function getDescription() {
return $this->description;
}

public function setDescription($description) {
$this->description = $description;
}

}

Затем у вас есть концепция объектов доступа к данным. Вы можете создать абстрактный класс, который будет расширен вашими объектами доступа к данным:

abstract class AbstractDAO {

protected $pdo;

public function __construct($pdo)
{
$this->pdo = $pdo;
}

abstract public function find($id);

abstract public function findAll();

abstract protected function buildModel($attributes);
}

Для вашего курса:

class CourseDAO extends AbstractDAO {


public function find($id) {
$statement = $this->pdo->prepare("SELECT * FROM courses WHERE id = :id");
$statement->execute(array(':id' => $id));
$result = $statement->fetch(PDO::FETCH_ASSOC);

return $this->buildModel($result);
}

public function findAll() {
$statement = $this->pdo->prepare("SELECT * FROM courses");
$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);

$courses = [];
foreach($results as $row)
$courses[] = $this->buildModel($row);

return $courses;
}

public function findByTitle($title)
{
...
}

public function create(Course $course)
{
...
}

protected function buildModel($attributes) {
$course = new Course();

$course->setId($attributes['id']);
$course->setTitle($attributes['title']);
$course->setDescription($attributes['description']);

return $course;
}
}

Современные фреймворки делают это автоматически, но я думаю, что хорошо понять, как это работает, прежде чем использовать мощные инструменты, такие как Eloquent или Doctrine.

голосует «data-shortcut =» V

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector