Выполнение вызовов SQL изнутри функции - PullRequest
0 голосов
/ 19 августа 2011

У меня есть функция PHP (назовите ее funcA), которая используется в нескольких местах, поэтому я поместил funcA (и некоторые связанные функции) в отдельный файл, который require d, в других файлах PHP.funcA делает многочисленные запросы к базе данных, которая уже открыта и используется кодом, который ее вызывает.Эти запросы выполняются через объект MDB2.

В нынешнем виде, когда вызывается funcA, вызывающая подпрограмма передает уже подключенный указатель объекта MDB2.Это прекрасно работает.

Интересно, что было бы лучше сделать funcA полностью автономной, не передавая указатель MDB2object и вместо этого имея funcA require MDB2 и подключаясь к базе данных со своимобъект mdb2.Это больше памяти, больше циклов ЦП и больше сетевого трафика, но лучше ли это?

Ответы [ 2 ]

1 голос
/ 19 августа 2011

«Лучшая практика» - это одна из тех вещей, которые почти невозможно определить.Однако, на мой взгляд, когда функция зависит от чего-то другого, лучше передать эту зависимость в функцию - как вы делаете сейчас.

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

Это обычно известно как внедрение зависимостей и широко рекомендуется в объектно-ориентированных архитектурах.

1 голос
/ 19 августа 2011

Некоторые могут также назвать это плохой практикой, но решением в этой ситуации может быть шаблон реестра или класс Singleton PDO .

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


Некоторые действительно простые примеры (вы должны действительно прочитать ссылки выше, так как понимание этих шаблонов может сэкономить вам много времени и хлопот)

// Singleton class MyPDO
// This assumes you have a singleton class extending PDO somewhere included or required
function funcA(){
    $database = MyPDO::getInstance();
    // ...
}

// Registry pattern
// This assumes that somewhere during your bootstrapping you create an 
// instance of PDO and store it in the registry so you can retrieve it 
// anywhere else later
function funcA(){
    $database = Registry::get('Database');
    // ...
}
...