Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][OOP] Automatyczne wstrzykiwanie
--marcin--
post
Post #1





Goście







Prosze o porade bardziej doswiadczonych. Czy istnieje jakis prosty sposob na wstrzykiwanie do kazdego nowo stworzonego obiektu innego? Chodzi mi o to ze po utworzeniu polaczenia z baza (pdo) chcialbym ten obiekt miec dostepny w kazdym innym obiekcie.
Go to the top of the page
+Quote Post
Wazniak96
post
Post #2





Grupa: Zarejestrowani
Postów: 550
Pomógł: 75
Dołączył: 5.06.2012
Skąd: Lębork

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


Tak. Są takie pola i metody jak statyczne. Wystarczy troszkę więcej poczytać o OOP jak już się za nie zabierasz. (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Turson
post
Post #3





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Jeżeli mowa o połaczeniu z PDO w każdej klasie, to

pdo.php
  1. class Connect{
  2. public function __construct() {
  3. $this->db = new PDO............
  4. }
  5. }


  1. require('pdo.php');
  2. class Test extends Connect{
  3. //tutaj możesz używać $this->db
  4. }


albo poczytać o autoload

Ten post edytował Turson 30.01.2014, 09:56:11
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@Turson no nie ucz ludzi zly nawykow.... nie po to wymyslono dziedziczenie, by wszystko dziedziczylo po obiekcie polączenia. O tym, ze kazdy obiekt na nowo tworzyc bedzie nowe połączenie to juz nawet nie wspominam, bo wstyd na potege (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Turson
post
Post #5





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Więc jak byś rozwiązał sprawę połączenia, by było dostępne w każdym obiekcie?
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Normalnie, na wiele sposobow:
1) Obiekt polaczenia przekazywany do konstruktora
2) Singleton - ponoc tego nie polecaja bo cos tam.
3) Registry - tego tez ponoc nie polecają bo cos tam (IMG:style_emoticons/default/wink.gif)

Ogolnie zasada jest balanie prosta: w calej aplikacji tworzysz jeden obiekt polaczenia i na nim operujesz. Tworzenie kilku obiektow połączenia a co za tym idzie kolejnych połączen w jednym request jest delikatnie rzecz mowiac nieoptymalne.
Go to the top of the page
+Quote Post
Turson
post
Post #7





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Nawiązując do 2 ostatnich zdań, w moim kodzie nie tworzę kilku obiektów połączenia, a jeden "Connect", który mogę podpinać pod inne obiekty.
Go to the top of the page
+Quote Post
phpion
post
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




class Test extends Connect - a czy tutaj przypadkiem nie zostanie wywołany Connect::__construct(), który utworzy nowy obiekt? Mógłbyś to obejść deklarując składową $db jako statyczną. Ale fakt - dziedziczenie tylko po to by mieć dostęp do połączenia z bazą jest bez sensu.
Go to the top of the page
+Quote Post
thek
post
Post #9





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Poza tym, abstrahując od tego co napisał nospor, można zamiast dziedziczenia użyć traitów. Moim zdaniem też będzie wygodniejsze do późniejszego rozwijania.
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
w moim kodzie nie tworzę kilku obiektów połączenia, a jeden "Connect", który mogę podpinać pod inne obiekty.
Chyba ominales ten rozdzial, w ktorym pisano jak dziala dziedziczenie (IMG:style_emoticons/default/wink.gif)

Go to the top of the page
+Quote Post
viking
post
Post #11





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Zawsze można użyć IoC, taka moda w PHP. Pasuje to do tego języka jak kurczak do parówek ale cóż.
Go to the top of the page
+Quote Post
Turson
post
Post #12





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Cytat
Ogolnie zasada jest balanie prosta: w calej aplikacji tworzysz jeden obiekt polaczenia i na nim operujesz.

Pokazałbyś pseudokod działania?
Go to the top of the page
+Quote Post
--marcin--
post
Post #13





Goście







Czyli najlepsza metoda to przekazanie obiektu w konstruktorze lub jak podal thek - traits, czy jest jakas zasadnicza roznica miedzy nimi oprocz tej ze traits jest od php5.4 ? bo przyznam, ze o traits dopiero teraz sie dowiedzialem (IMG:style_emoticons/default/facepalmxd.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Tu kod apropo dziedziczenia dla lepszej wizualizacji
  1. class Connect {
  2. public function __construct() {
  3. echo 'Tu sie własnie tworzy kolejny obiekt klasy Connect, a co za tym idzie kazdy kolejny obiekt, ktory on w sobie tworzy <br />';
  4. }
  5. }
  6.  
  7. class T1 extends Connect {}
  8. class T2 extends Connect {}
  9. class T3 extends Connect {}
  10.  
  11. $t1 = new T1();
  12. $t2 = new T2();
  13. $t3 = new T3();


Cytat
Pokazałbyś pseudokod działania?


$db = new DB(); //gdzies tam w aplikacji tworzysz sobie taki obiekt
$obiekt = new JakisObiekt($db); //gdzies tam indziej przekazujesz obiekt $db do aktualnie tworzonego obiektu. Oczywiscie konstruktor musi go odebrac.

Pomijam tu juz kwestie widocznosci zmiennej $db. To juz zupelnie inna bajka.
Ja osobiscie uzywam Rejestrow i jest mi z tym dobrze. Wszedzie tam gdzie potrzebuje to poprostu siegam po utworzony juz obiekt, ktory jest w Rejestrze.
Dodatkowo zrobilem "leniwe połączenie" czyli połączenie z bazą tworze dopiero wtedy, gdy obiekt bazy chce wykonac zapytanie, a nie w momencie tworzenia obiektu bazy. Dzieki temu, nawet pomimo faktu, ze obiekt bazy tworze na samym poczatku aplikaji, to połączenie z bazą nawiązuje dopiero wtedy gdy potrzeba, albo w ogole, jesli nie bylo takiej potrzeby
Go to the top of the page
+Quote Post
--marcin--
post
Post #15





Goście







nospor - zakladajac, ze i tak kazde 'odswiezenie' strony bedzie korzystac z bazy jaka przewage daje polaczenie leniwe nad zwyklym przy tworzeniu obiektu?

mozesz rozwinac lub dac linka cos na temat tych rejestrow?
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




W moim systemie twoje zalozenie jest bledne, wiec stosuje leniwe polaczenia. Po cos przeciez wymyslono cache (IMG:style_emoticons/default/wink.gif)
Jesli jednak faktycznie, twoja aplikacja za kazdym razem musi korzystac z bazy, to leniwe połączenia nie mają raczej sensu ale tez i nie przeszkadzają

Zas co do rejestrow to wpisz w goole: Wzorzec Registry
Go to the top of the page
+Quote Post
Turson
post
Post #17





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Dzięki nospor za wyjaśnienie. Mnie ktoś kiedyś doświadczony podpowiedział sposób, który użyłem w poście #3 i stąd byłem przekonany, że jest w porządku. Ale od czego jest forum... (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 17:18