Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekazanie wartości pola z klasy do klasy
Forum PHP.pl > Forum > PHP
Rudi1204
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?
nospor
$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;
Rudi1204
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)
nospor
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.
Crozin
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.
Rudi1204
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
Crozin
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.
zegarek84
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.

Rudi1204
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
pejott
Ż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.
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-2025 Invision Power Services, Inc.