Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Przekazanie wartości pola z klasy do klasy
Rudi1204
post 29.04.2011, 07:30:14
Post #1





Grupa: Zarejestrowani
Postów: 37
Pomógł: 2
Dołączył: 11.03.2007

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


Witam. Załóżmy, że mamy klasy:
  1. class Base {
  2. public $zmienna1;
  3. public $zmienna2=array();
  4.  
  5. public function __construct() {
  6. $this->zmienna1 = $_GET['zmienna1'];
  7. }
  8.  
  9. public function ustawZmienna2() {
  10. // robie tutaj zapytanie np do bazy z użyciem $this->zmienna1;
  11. $this->zmienna2 = $mysql_result;
  12. }
  13. }
  14.  
  15. class Second extends Base {
  16. public $key;
  17. public $klon;
  18.  
  19. public function setKey($key) {
  20. $this->$key = $key;
  21. }
  22.  
  23. public function klonuj() {
  24. $this->klon = $this->zmienna2[$this->key];
  25. return $this->klon;
  26. }
  27. }
  28.  
  29. // i teraz wyołanie
  30. $klasa = new Base();
  31. $klasa->ustawZmienna2();
  32.  
  33. $inna_klasa = new Second();
  34. $inna_klasa->setKey('jakis_klucz');
  35. $wynik = $innaKlasa->klonuj();
  36.  

i teraz pytanie...
Czy jest jakaś możliwość, aby podczas dziedziczenia przekazać do klasy Second() otrzymaną już wcześniej wartość pola $this->zmienna2 , np by ponownie nie łączyć się z bazą i nie wykonywać chociażby formatowania wyniku (tak np).
Tak jakby co na google szukałem, ale kto wie może źle sformuoływałem pytanie?

Ten post edytował Rudi1204 29.04.2011, 08:27:38
Go to the top of the page
+Quote Post
nospor
post 29.04.2011, 07:35:16
Post #2





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




$klasa oraz $inna_klasa to dwa rożne obiekty nie mające nic ze sobą wspólnego. Dziedziczenie działa na zupełnie innej płaszczyźnie niż myślisz.

A jak przekazac? Bardzo prosto:
$inna_klasa->zmienna2 = $klasa->zmienna2;


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Rudi1204
post 29.04.2011, 07:50:22
Post #3





Grupa: Zarejestrowani
Postów: 37
Pomógł: 2
Dołączył: 11.03.2007

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


Cytat(nospor @ 29.04.2011, 07:35:16 ) *
$klasa oraz $inna_klasa to dwa rożne obiekty nie mające nic ze sobą wspólnego. Dziedziczenie działa na zupełnie innej płaszczyźnie niż myślisz.

A jak przekazac? Bardzo prosto:
  1. $inna_klasa->zmienna2 = $klasa->zmienna2;


No ok, ale czy dobrze rozumiem, że w takim razie nie ma możliwości przekazania jakoś
  1. $this->klon = $this->zmienna2[$this->key]
wewnątrz klasy Second (później np jeszcze zrobić tak samo w innych klasach Thirt, Nezxt i tak dalej...)questionmark.gif

EDIT: poprostu chciał bym żeby $this->zmienna2 była dostępna we wszystkich innych klasach które później będę pisał (czyli klasa Base była by takim konstruktorem, albo ConfigSetterem), coś w rodzaju jak rozszerzenie zasięgu (taki global bez użycia global)

Ten post edytował Rudi1204 29.04.2011, 08:07:42
Go to the top of the page
+Quote Post
nospor
post 29.04.2011, 08:14:18
Post #4





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




Totalnie źle do tego podchodzisz.

1) Nowy obiekt nie ma nic do innego obiektu nawet z tej samej klasy
2) W base łączysz się bazą i chcesz to dziedziczyć? Dziedziczenie nie do takich celów służy.
Poczytaj o wzorcach projektowych, np. Registry - wkładasz sobie obiekt bazy do rejestru i wyciągasz z niego kiedy potrzebujesz. Tego nie załatwia się przez dziedziczenie.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Crozin
post 29.04.2011, 08:19:57
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
(taki global bez użycia global)
Czyli jeszcze większe zło bo dodatkowo ukrywasz fakt, że korzystasz z przestrzeni globalnej.

Dziedziczenie nie działa na zasadzie "nowo utworzone obiekty otrzymują w spadku dane z już istniejących obiektów". Nowo utworzone obiekty, których klasy dziedziczą po innych klasach otrzymują jedynie "infrastrukturę". Pamiętaj, że w programowaniu obiektowym trzeba zawsze patrzeć przez pryzmat obiektów, nie klas (chyba, że ma się do czynienia z właściwościami lub metodami statycznymi, na które w tym przypadku nie ma najprawdopodobniej miejsca).

Gdybyś dokładnie opisał co chcesz stworzyć moglibyśmy Ci poradzić najlepsze rozwiązanie.

PS. Przestrzegaj konwencji nazewnictwa i stosuj konwencję camelCase, czyli ustawZmienna2(), setKey() itd.
Go to the top of the page
+Quote Post
Rudi1204
post 29.04.2011, 08:34:48
Post #6





Grupa: Zarejestrowani
Postów: 37
Pomógł: 2
Dołączył: 11.03.2007

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


Dokładniej to chodzi mi o stworzenie klasy głównej Base, która by pobierała na podstawie przekazanych zmiennych metodą $_GET no np wartości component (czyli com_component = test w url by było). Następnie łącząc się z bazą pobiera parametry tego kompnentu i przekazuje je do tablicy, dzieki pomocniczej funkcji importuje właściwy pliczek z klasą kontrolera właściwego komponentu i przekazuje tam tą właśnie tablicę z parametrami. Czyli klasa Base to był by taki Base Controller. (tak na szybko, mam nadzieje, że za bardzo nie namotałem :])

ps. - nazewnictwo zmienione
Go to the top of the page
+Quote Post
Crozin
post 29.04.2011, 08:54:19
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. Obiekty nigdy nie powinny korzystać z czegokolwiek z przestrzeni globalnej (patrz użycie $_GET) - to prowadzi zawsze do problemów nawet w przypadku niezbyt rozbudowanych aplikacji.
2. Jeden obiekt jedno zadanie. Utwórz osobny obiekt reprezentujący żądanie HTTP, osobny pobierający dane z bazy danych.
3. Pamiętaj że dziedziczenie to rodzaj relacji jest (is a), natomiast Ty masz tutaj wszędzie co najwyżej relację ma (has a), tak więc obiekty powinieneś jawnie wstrzyknąć jako zależności.

Ten post edytował Crozin 29.04.2011, 08:54:38
Go to the top of the page
+Quote Post
zegarek84
post 29.04.2011, 09:57:16
Post #8





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


skorzystaj ze zmiennej statycznej ;] - zdeklaruj ją w tej klasie bazowej protected static [by z zewąntrz nic jej nie mogło napisać] lub public static [ale wtedy zmienną ktoś Ci może przestawić z zewnątrz klasy/obiektu]

pewnie innym to rozwiazanie nie będzie pasowało ale umówmy się, że odłożyłeś pewną wartość pod określoną zmienną w lokalnym skope dla pewnej rozdziny klasy - tą zmienną możesz też zmieniać w klasach potomnych ;]...

lub zdeklaruj private static $zmienna i ustawiaj ją przez odpowiednie metody dostępowe ;]
Cytat(nospor @ 29.04.2011, 09:14:18 ) *
Poczytaj o wzorcach projektowych, np. Registry - wkładasz sobie obiekt bazy do rejestru i wyciągasz z niego kiedy potrzebujesz. Tego nie załatwia się przez dziedziczenie.



--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
Rudi1204
post 29.04.2011, 10:42:55
Post #9





Grupa: Zarejestrowani
Postów: 37
Pomógł: 2
Dołączył: 11.03.2007

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


w sumie troche poszperałem poszukałem i dzięki waszym podpowiedzią znalazłem przykłady użycia rejestru
Odwołanie z klasy do obiektu bez global
oraz
Przekazanie klasy do innej klasy, Przekazanie klasy do innej klasy
... i jak narazie pasi mi to (narazie bo siedze w pracy jesczze i robie cos innego ;p) ale tak czy inaczej DZIĘKI WSZYSTKIM ZA POMOC smile.gif
Go to the top of the page
+Quote Post
pejott
post 29.04.2011, 18:53:29
Post #10





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Żeby łatwo było zaprzyjaźnić Ci się z Dependency Injection polecam...
https://github.com/fabpot/pimple.

I pamiętaj, nie wynajduj koła na nowo.
Własny framework to dobry sposób na naukę, ale są lepsze. (en)

Pozdrawiam.

@edit: typo.

Ten post edytował pejott 29.04.2011, 18:54:00
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: 13.06.2025 - 05:40