класс — это хорошая практика для инкапсуляции в PHP?

Например, у меня есть класс говорят, что выполняет запрос MySQL, и я хочу инкапсулировать этот класс.

class SqlQuery {

private $database_connection_obj;

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

public function runQuery($query, $params) {

//run query implementation...

}

}

Инкапсуляция и сокрытие информации означает, что я хочу закрыть прямой доступ к методам класса, чтобы функционировать runQuery() не должно быть публичным, поэтому я делаю это приватным и добавляю метод exacuteQuery() с единственной целью передать данные в частную функцию runQuery(),

Какова практическая польза от этого, потому что в конце он работает точно так же, как код выше.
Должна ли быть некоторая санация входных данных, сделанных в публичном методе, прежде чем они будут переданы в приватный метод, или зачем вообще писать этот дополнительный код?

class SqlQuery {

private $database_connection_obj;

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

public function exacuteQuery($external_query, $external_params) {
$this->runQuery($external_query, $external_params);
}

private function runQuery($query, $params) {

//run query implementation...

}

}

0

Решение

Основная идея — сделать классы похожими черные ящики, Это означает, что посторонний (а именно, другой класс или функция, содержащая экземпляр класса) не имеет представления о том, как он работает внутри. Это Аннотация им.

Внутренняя работа запроса не имеет значения для класса, содержащего запрос и вызывающего ->run()Он заботится только о выполнении запроса, а не о том, как и где он выполняется.

Обратите внимание, что запрос — это довольно низкоуровневая абстракция, он сравнительно близок к прямым вызовам стандартных библиотечных функций / объектов. Но, учитывая низкоуровневую абстракцию, вы можете создать абстракцию более высокого уровня.

Например, UserStore, который внутренне использует SqlQuery объекты, чтобы получить и установить User объекты в базу данных. Класс с использованием UserStore не знает, что UserStore использует SqlQuery внутренние объекты, он просто знает, что это объект, который может сохранять и извлекать User объекты.

Этот вид «сокрытия» и «инкапсуляции» на самом деле дает вам много возможностей, потому что теперь классы могут использовать другие классы, не завися от конкретных деталей реализации. Если завтра вы захотите изменить способ хранения Users, вы просто вносите изменения в UserStore класс, пока он имеет тот же публичный API, остальная часть вашего приложения даже не узнает, что что-то изменилось.

2

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

Данные детали не имеют никакого значения, но это зависит от работы. Я использую его много раз, когда мне нужно создать функцию, к которой нельзя получить доступ напрямую, но только методом ее использования. Это оптимизирует код и запрещает доступ вне кода. В противном случае любой может изменить параметры, которые могут быть вредными.

1

По вопросам рекламы [email protected]