2016-11-02 2 views
0

Например, у меня есть класс, который говорит, что выполняет запрос MySQL, и я хочу инкапсулировать этот класс.Является ли это хорошей практикой для инкапсуляции в PHP?

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

Я не вижу никаких причин для переноса 'runQuery()' в данный код. Почему, по-вашему, вам нужно усложнить свой код такой оболочкой? =) –

+0

Какова инкапсуляция, тогда вы можете привести мне пример. –

ответ

1

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

+0

Можете привести пример, пожалуйста. –

+0

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

2

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

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

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

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

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

+0

Я получил теорию, мой вопрос больше о реализации в PHP, вы бы сказали, что первый или второй пример кода, который я предоставил, должен использоваться? Зачем. –

+0

О, извинения. В частности, нет никакой пользы для создания публичной функции, которая только делегирует частную функцию с той же подписью.Вы можете использовать делегирование для частных функций, чтобы абстрагировать подобную функциональность из нескольких методов (например, общая функциональность как 'select()', так и 'update()' my have - это необходимость подготовить запрос, который может быть частную функцию, которую звонят оба публики, чтобы получить некоторую услугу. –

Смежные вопросы