Страницы

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

воскресенье, 22 декабря 2019 г.

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

#php #global_variables


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

использовать класс внутри функции получилось только с помощью global
пример кода

blabla('SELECT ... ', $param1, $param2);
}


это нормально? или лучше использовать что-то другое для определения $db внутри функции?
    


Ответы

Ответ 1



Идеальным ответом является комментарий от 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 вполне оправдано.

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

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