есть класс, который осуществляет работу с БД
есть функция, которая возвращает определенную строку, в т.ч. с помощью класса
использовать класс внутри функции получилось только с помощью global
пример кода
$db = new TestClass();
function getContent($param1, $param2){
global $db;
return $db->blabla('SELECT ... ', $param1, $param2);
}
это нормально? или лучше использовать что-то другое для определения $db внутри функции?
Ответ
Идеальным ответом является комментарий от Vladimir Gamalian:
Для небольших скриптов вполне нормально, польза от отказа от global ощущается с увеличением сложности программной системы.
От себя я бы определил так:
Если, как в данном случае, код пишется процедурно, то ничего плохого в таком использовании global нет.
Вообще, global ругают по двум причинам. Первая - это действительно страх и ужас, когда этот оператор используется не по назначению, для передачи локальных переменных в функцию, что катастрофически запутывает программу. Допустим, у нас есть функция
function f1() {
global $var
$var++;
}
и где-то в коде программы встречается вот такой кусок:
$var = 1;
f1();
Что произошло с переменной $var, что делала функция f1() - из этого кода решительно не понятно.
Такого кода надо избегать всегда. Вместо global в данном случае надо всегда писать так:
function f1($var) {
return $var++;
}
и использовать
$var = 1;
$var = f1($var);
Вторая причина - это, условно говоря, невозможность подменить $db на лету.
В более сложных программных системах иногда возникает необходимость подменять тот или иной сервис в зависимости от задачи. К примеру, вместо mysql использовать, скажем, MongoDB. Для одной и той же задачи, но в зависимости от контекста. И в этом случае global станет помехой, и нам нужно будет изобретать более сложные способы передачи сервисов в функцию.
Но до тех пор пока наша программа достаточно простая, не использует ООП, и при этом мы используем этот оператор для действительно глобальных сервисов, использование global вполне оправдано.
Комментариев нет:
Отправить комментарий