Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czas życia obiektu
Forum PHP.pl > Forum > PHP > Object-oriented programming
Jarod
W programie napisanym w jakimś języku programowania, utworzony obiekt istnieje dopóki nie zostanie zniszczony. W php zmienne, obiekt istnieje dopóki skrypt nie zakończy działania albo nie zostanie zniszczony. To jest problem, który nie do końca mogę zrozumieć, abo inaczej sposób jego rozwiązania. Weźmy pierwszy lepszy przykład, przy którym ten problem dla mnie znowu się uwidocznił. Zastosowanie wzorca registry. Przypomniałem sobie ten wzorzec z artykułu http://www.strefaphp.net/artykul59.html

Załóżmy, że w pliku głównym index.php, zaraz po wystartowaniu aplikacji, wczytywana jest konfiguracja systemu:
  1. <?php
  2. $registry = new Registry;
  3. $registry->set ( 'config', parse_ini_file ( 'plik.ini' ) );
  4. ?>


dzięki czemu mamy łatwy dostęp do konfiguracji:
  1. <?php
  2. echo $registry->get ( 'config_zmienna1' );
  3. echo $registry->get ( 'config_zmienna2' );
  4. ?>


Następnie tworzone jest menu, etc. Użytkownik wybiera jakąś opcje z menu, kontroler oddaje działanie do modelu, a wyniki zwracane są do widoku. Sedno sprawy:

Jak sprawić, żeby w każdym skrypcie (przecież model jest w innym skrypcie, widok w innym), te dane były dostępne? Żeby w każdym skrypcie nie trzeba było tworzyć instancji obiektu Registry i nie ładować do niego danych? Każdą inną klasę, która będzie korzystać z obiektu Registry tak projektować, żeby jako parametr konstruktora mogła przyjmować obiekt Registry?
ActivePlayer
Cytat
Jak sprawić, żeby w każdym skrypcie (przecież model jest w innym skrypcie, widok w innym), te dane były dostępne? Żeby w każdym skrypcie nie trzeba było tworzyć instancji obiektu Registry i nie ładować do niego danych?

Można to zastosować przez uzycie wzorca singleton (Chyba zazębiliśmy się z innym tematem)
  1. <?php
  2. $rejestr = registry::getInstance();
  3. ?>

lub poprzez utworzenie rejestru na bazie metod statycznych:
  1. <?php
  2. registry::set('nazwa', $obiekt);
  3. // w jakiejstam klasie
  4. $obiekt = registry::get('nazwa');
  5. ?>


Wydaje mi sie ze dopiero teraz poznałeś co to singleton smile.gif
Jarod
Cytat(ActivePlayer @ 15.01.2007, 20:30:56 ) *
Można to zastosować przez uzycie wzorca singleton (Chyba zazębiliśmy się z innym tematem)
  1. <?php
  2. $rejestr = registry::getInstance();
  3. ?>

Idąc Twoim tokiem rozumowania, każda klasa powinna implementować wzorzec singleton, bo przecież w programowaniu obiektowym nie chodzi tylko o tworzenie klas ale także sposób wpsółpracy tych obiektów. I o to właśnie pytam..

Przykład: Masz klasę (np. Data) do pobierania danych z jakiegoś źródła: baza, plik tekstowy, plik xml,itp. Oraz klasę do wyświetlania tych wyników (np. View). Tworzysz obiekt View a w nim obiekt Data i np za pomocą foreach wyświetlasz te dane - proste.
Ale co zrobić, jeśli tworzysz jakiś obiekt w skrypcie index.php i dane zebrane przez ten obiekt chcesz przekazać (chcesz żeby były dostępne) w skrypcie listOfWorkers.php ? (może nie najlepszy przykład ale o coś takiego mi chodzi)
ActivePlayer
Cytat
Idąc Twoim tokiem rozumowania, każda klasa powinna implementować wzorzec singleton, bo przecież w programowaniu obiektowym nie chodzi tylko o tworzenie klas ale także sposób wpsółpracy tych obiektów. I o to właśnie pytam..

rejestr w systemie masz jeden i do niego jak do worka wsadzasz obiekty które potrzebne Ci są wszędzie.

obiektów data do pobierania danych mozesz miec kilka np:
  1. <?php
  2. $tresc = new Data('costam.txt');// przyjąłem ze w konstrukotrze podaje sie sciezke do zrodla.
  3. $xmlik = new Data('sciezka_do_xmla.xml');
  4. ?>

a potem sobie na nich operujesz w jakistam przykładowy sposob.
Jarod
Cytat(ActivePlayer @ 15.01.2007, 20:54:58 ) *
rejestr w systemie masz jeden i do niego jak do worka wsadzasz obiekty które potrzebne Ci są wszędzie.

obiektów data do pobierania danych mozesz miec kilka np:
  1. <?php
  2. $tresc = new Data('costam.txt');// przyjąłem ze w konstrukotrze podaje sie sciezke do zrodla.
  3. $xmlik = new Data('sciezka_do_xmla.xml');
  4. ?>

a potem sobie na nich operujesz w jakistam przykładowy sposob.



Czyli wychodzi na to, że jedynym słusznym rozwiązaniem jest stosowanie wzorca registry? A tak rzadko go spotykam..

Bo myślałem nad innym sposobme ale nie wiem na le to jest zgodne z programowaniem OOP. Mamy jakiś obiekt np. Data i chcąc go przekazać do obiektu View, tworzymy klasę View w taki sposób aby construktor View przyjmował Data jako parametr.
np;
  1. <?php
  2. $oData = new Data();
  3. $oView = new View($oData, $param1, $param2);
  4. ?>

dzięki czemu w obiekcie oView mamy dostęp do obiektu oData.

Czy to sposób jest prawidłowy?
menic
Jak najbardziej prawidłowy. Ja u siebie jeszcze nie uzyłem registry do przechowywania instancji. Jak mi są potrzebne to przekazuje jako parametr. Natomiast przydatne jest załadowanie instancji do registry w przypadku gdy z tego obiektu korzystasz duzo dalej, po drodze wywolujac kilka nowych klas itp. Wtedy pilnowanie instancji jest trudne i niewygodne smile.gif
Jarod
Cytat(menic @ 15.01.2007, 21:24:26 ) *
Jak najbardziej prawidłowy. Ja u siebie jeszcze nie uzyłem registry do przechowywania instancji. Jak mi są potrzebne to przekazuje jako parametr.

No to super bo dla mnie jest to całkiem logiczne.

Cytat(menic @ 15.01.2007, 21:24:26 ) *
Natomiast przydatne jest załadowanie instancji do registry w przypadku gdy z tego obiektu korzystasz duzo dalej, po drodze wywolujac kilka nowych klas itp. Wtedy pilnowanie instancji jest trudne i niewygodne smile.gif

No dobra ale ładujesz do registry i tą tablice zapisujesz gdzieś do bazy, pliku? No bo jeśli gdzieś dalej tego będziesz potrzebował to obiekt już dawno nie istnieje.. I co wtedy trzeba te dane wczytać albo utworzyć registry i znowu go załadować ale to bez sensu..

Chyba, że obiekt Registry przekazujesz jako parametr do każdej klasy.. żeby go utrzymać przy życiu..
menic
Registry jest klasą złozonych z samych static, tak wiec nie tworzysz w ogole instancji tej klasy winksmiley.jpg Z kazdego miejsca w skrypcie ona jest dosepna Registry::Funkcja() winksmiley.jpg
Jarod
Cytat(menic @ 15.01.2007, 21:52:41 ) *
Registry jest klasą złozonych z samych static, tak wiec nie tworzysz w ogole instancji tej klasy winksmiley.jpg Z kazdego miejsca w skrypcie ona jest dosepna Registry::Funkcja() winksmiley.jpg

Nie wiedziałem. Oblookałem przykład na http://www.strefaphp.net/artykul59.html i chyba tam jest błąd. Nie powinno być static $aVars ?
menic
Tzn tak. Nie dopowiedziałem wszystkiego. Registry moze byc zbudowany w oparciu o wzorzec Singleton biggrin.gif

Musisz na spokojnie wszystko przeanalizowac, co by ci sie całkiem nie pomieszało winksmiley.jpg
http://maxprogram.pl/readarticle.php?article_id=78 tu sa wzorce ciekawie opisane smile.gif
Cysiaczek
Registry nie musi być klasa statyczną : )

@J4r0d - w którymś topiku właśnie pisałem Tobie, że zalety Singletona odkrywasz przy dużym systemie : )
Rejestr to po prostu obiekt udostępniający inne obiekty (względnie zmienne). Sam rejestr albo przekazujesz jako argument (możesz wymusić typ), albo używasz Singletona : )
  1. <?php
  2. class Registry{}
  3.  
  4. class User{
  5. function __construct(Registry $config){}
  6. }
  7. $user=new User(new Registry());
  8. ?>


Pozdrawiam.
Jarod
Cytat(Cysiaczek @ 16.01.2007, 00:03:28 ) *
@J4r0d - w którymś topiku właśnie pisałem Tobie, że zalety Singletona odkrywasz przy dużym systemie : )

Ciężko mi to sobie wyobrazić..
Cytat(Cysiaczek @ 16.01.2007, 00:03:28 ) *
Rejestr to po prostu obiekt udostępniający inne obiekty (względnie zmienne). Sam rejestr albo przekazujesz jako argument (możesz wymusić typ), albo używasz Singletona : )
  1. <?php
  2. class Registry{}
  3.  
  4. class User{
  5. function __construct(Registry $config){}
  6. }
  7. $user=new User(new Registry());
  8. ?>


Pozdrawiam.


No tak ale i tak wszystko sprowadza się do przekazywania obiektu do innego obiektu w postaci parametru. Właśnie to chciałem wiedzieć smile.gif
Cysiaczek
Yh? Jest różnica, bo można też tak i można olać argumenty funkcji : )
  1. <?php
  2. class Registry{
  3. //singleton
  4. }
  5.  
  6. private $reg;
  7.  
  8. class User{
  9. function __construct(){
  10. $this->reg=Registry::getInstance();
  11. }
  12. }
  13. $user=new User();
  14. ?>


Właśnie po to robimy z Registry Singletona, żeby przypadkiem nie dostać nowego obiektu
Pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.