Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Czas życia obiektu
Jarod
post 15.01.2007, 20:20:14
Post #1





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


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?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
ActivePlayer
post 15.01.2007, 20:30:56
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Jarod
post 15.01.2007, 20:48:36
Post #3





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


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)


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
ActivePlayer
post 15.01.2007, 20:54:58
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Jarod
post 15.01.2007, 21:20:09
Post #5





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


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?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
menic
post 15.01.2007, 21:24:26
Post #6





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

Ostrzeżenie: (0%)
-----


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


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
Jarod
post 15.01.2007, 21:44:23
Post #7





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


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..


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
menic
post 15.01.2007, 21:52:41
Post #8





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

Ostrzeżenie: (0%)
-----


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


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
Jarod
post 15.01.2007, 22:08:04
Post #9





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


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 ?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
menic
post 15.01.2007, 22:15:58
Post #10





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

Ostrzeżenie: (0%)
-----


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


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
Cysiaczek
post 16.01.2007, 00:03:28
Post #11





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Jarod
post 16.01.2007, 11:45:31
Post #12





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


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

Ten post edytował J4r0d 16.01.2007, 11:48:54


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
Cysiaczek
post 16.01.2007, 12:08:39
Post #13





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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 think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 06:49