Jak przechowywać obiekty, które są potrzebne w dużej ilości funkcji?

0

Załóżmy, że mam tablicę obiektów klasy Podstrona, albo obiekt Podstrony z tablicą obiektów Podstrona i jakieś funkcje, np. echoAll(), getById(). W klasie Podstrona np. getLink(). Oprócz tego takich zestawów będzie kilka np. Użytkownicy - Użytkownik, Klienci - Klient itp. i Klasa do łączenia z bazą danych. Jak dać dostęp do tych obiektów w różnych miejscach? Używanie w każdej funkcji słowa global z listą wydaje mi się mało profesjonalne. Np. w obiekcie klasy Klient będę miał funkcję getOpiekun(), która zwraca obiekt klasy Użytkownik. Z tego co czytam to większość pisze, że Dependency Injection jest lepsze od używania globali i singletonów, ale mi się to wydaje najgorszym rozwiązaniem, żebym musiał mieć w swoich 3 konstruktorach listę 10 parametrów. Później robię var dump i okazuje się, że moje 10 obiektów przechowuje taką samą 2000 elementową tablicę słownikową.

0

Podaj jakiś inny przykład, jakiś diagram może - z tego co napisałeś ciężko coś sensownego wyłapać.

0

Później robię var dump i okazuje się, że moje 10 obiektów przechowuje taką samą 2000 elementową tablicę słownikową.

Spokojnie, dopóki ich nie modyfikujesz PHP przechowuje ją w pamięci tylko raz i robi sobie wewnętrzne referencje. Sprawdź sobie na kodzie:

<?php

$y = '';
for ($i=1; $i<=1024; $i++) {
    $y .= '123456789o';
}

$lp = memory_get_usage();
echo "Przed zdefiniowaniem tablicy: ".$lp.PHP_EOL;

$aZrodlowaTablica = [];

$lp2 = memory_get_usage();
echo "Po zdefiniowaniu pustej tablicy: ".$lp2." (roznica ".($lp2-$lp).")".PHP_EOL;

for ($i=1; $i<=100; $i++) {
    $aZrodlowaTablica[] = $y;
}

$lp = memory_get_usage();
echo "Po wypełnieniu tablicy: ".$lp." (roznica ".($lp-$lp2).")".PHP_EOL;

$aDocelowaTablica = $aZrodlowaTablica;

$lp2 = memory_get_usage();
echo "Po skopiowaniu tablicy: ".$lp2." (roznica ".($lp2-$lp).")".PHP_EOL;

$aDocelowaTablica[0] = 'test';

$lp = memory_get_usage();
echo "Po modyfikacji kopii: ".$lp." (roznica ".($lp-$lp2).")".PHP_EOL;

Wynik u mnie:

Przed zdefiniowaniem tablicy: 233728
Po zdefiniowaniu pustej tablicy: 234096 (roznica 368)
Po wypełnieniu tablicy: 243288 (roznica 9192)
Po skopiowaniu tablicy: 243392 (roznica 104)
Po modyfikacji kopii: 252640 (roznica 9248)

Wiem, że to nie jest perfekcyjna czy dokładna metoda pomiaru, ale teorię można zweryfikować.

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