Alternatywa dla global

0

Ciągle czytam że używanie global jest "złe". I teraz przypuśćmy że mam klasę mysql obiekt tej klasy w zmiennej mysql, to lepszym rozwiązaniem będzie używanie mysql::funkcja() ?
Czy global $mysql;
$mysql->funkcja();
czytałem że klasa::funkcja() to wolniejsza metoda od $klasa->funkcja()
i jeszcze jedeno jeśli wczytuje plik w którym są zmienne i chce się do nich odwołać w funkcji to lepiej użyć global czy przekazać te zmienne jako parametr (aktualnie mówię o pliku w którym mam tablice dwu wymiarowa w której mam jakiś tekst)

0

Zazwyczaj, jeżeli używasz funkcji, to lepiej jest do niej przekazywać zmienne przez parametry, a nie używać zmiennych globalnych. Daje to możliwość użycia tej samej funkcji w wielu scenariuszach, niekoniecznie zawsze przecież ta globalna zmienna będzie dostępna.

Co do :: vs -> to nie ma tak prosto, że można je stosować wymiennie. Wywołanie :: to wywołanie metod (metoda = funkcja w klasie) statycznych, które są niezależne od aktualnej instancji klasy. Wywołanie metody obiektu poprzez -> to wywołanie metody operujące na aktualnym obiekcie. W momencie kiedy wywoływana metoda odwołuje się do $this, to niemożliwe jest jej wywołanie statyczne, bo jest to bez sensu.

Dobrym sposobem rozwiązania twojego problemu jest użycie tzw. singletona. W swojej klasie mysql zrób metodę (tutaj statyczną), np. getInstance(), która będzie zwracać albo już wcześniej utworzony obiekt (jeżeli taki jest) albo zupełnie nowy obiekt oraz statyczne pole $instance, które będzie przechowywać referencję do niego. I wtedy każde zrobienie: $mysql = MySQL::getInstance(); spowoduje, że dostanie się ten jeden, konkretny, już stworzony wcześniej obiekt klasy MySQL.

Przykładowa klasa, która to implementuje: http://www.micahcarrick.com/php5-mysql-database-class.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1