Страницы

Поиск по вопросам

среда, 13 февраля 2019 г.

global в функции это нормально?

есть класс, который осуществляет работу с БД есть функция, которая возвращает определенную строку, в т.ч. с помощью класса
использовать класс внутри функции получилось только с помощью 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 вполне оправдано.

Комментариев нет:

Отправить комментарий