Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [oop] wywolanie jednej klasy z poziomu drugiej
poligon81
post 17.04.2008, 21:59:39
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 17.04.2008

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


Cześć,

Mam jak dotąd dość podstawowe pojęcie o programowaniu obiektowym w PHP, ale staram się go nauczyc efektywnie wykorzystywać, co mam nadzieję, zaprocentuje w przyszłości...

Piszę właśnie stosunkowo prostą aplikację ale nie wiem jak rozwiązać jedną kwestię koncepcyjną


mam taki oto plik index.php

  1. <?php
  2. require_once 'classA.php';
  3. $instancja_klasy_a = new a;
  4.  
  5. require_once 'classB.php';
  6.  
  7.  
  8. require_once 'classC.php';
  9.  
  10. itd...
  11. ?>



I teraz, chciałbym zeby w jakis sposob metody i pola z $instancja_klasy_a były dostępne w obrębie innych klas.
Pytanie teraz czy jest jakas możliwośćbo zrobic cos takiego ?
Czy jesli klasy B, C itp bedą dziedziczyć po klasie A, metody i pola z $instancja_klasy_a będą dostępne z poziomu innych klas?

Oczywiscie moge tworzyć instancje klasy A w konstruktorze albo w metodach klasy B i C ale chciałbym tego uniknąć gdyż klasa A jest dość mocno obciążającą serwer i chciałbym uniknąć wielokrotnego przetwarzania tych samych danych...

Z góry dzięki za pomoc
Go to the top of the page
+Quote Post
sniezny_wilk
post 17.04.2008, 22:31:11
Post #2





Grupa: Zarejestrowani
Postów: 732
Pomógł: 80
Dołączył: 25.05.2005
Skąd: Szczecin

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


Cytat(poligon81 @ 17.04.2008, 20:59:39 ) *
Czy jesli klasy B, C itp bedą dziedziczyć po klasie A, metody i pola z $instancja_klasy_a będą dostępne z poziomu innych klas?


Nie bardzo rozumiem te pytanie. Chcesz ze zmiennej $instancja_klasy_a, wyciągnąć metody klas B i C ?


--------------------
Go to the top of the page
+Quote Post
poligon81
post 17.04.2008, 22:47:43
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 17.04.2008

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


Cytat(sniezny_wilk @ 17.04.2008, 23:31:11 ) *
Nie bardzo rozumiem te pytanie. Chcesz ze zmiennej $instancja_klasy_a, wyciągnąć metody klas B i C ?


Nie..

Wyobraz sobie sytuacje, kiedy klasa a laczy sie z baza danych i wyciaga jakies dane ktore przechowuje w polach.
Oczywiscie beda to pola instancji tej klasy.

Teraz, w klasach B C i innych chciałbym skorzystać z danych jakie zawierają pola instancji klasy A...
Go to the top of the page
+Quote Post
KapiX
post 17.04.2008, 22:52:25
Post #4





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 4.12.2007

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


Cytat(poligon81 @ 17.04.2008, 23:47:43 ) *
Nie..

Wyobraz sobie sytuacje, kiedy klasa a laczy sie z baza danych i wyciaga jakies dane ktore przechowuje w polach.
Oczywiscie beda to pola instancji tej klasy.

Teraz, w klasach B C i innych chciałbym skorzystać z danych jakie zawierają pola instancji klasy A...


IMO najprościej byłoby zrobić publiczne metody typu getXXX() albo, w przypadku dziedziczenia, nadać im atrybut protected.
Go to the top of the page
+Quote Post
poligon81
post 17.04.2008, 22:58:46
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 17.04.2008

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


Cytat(KapiX @ 17.04.2008, 23:52:25 ) *
IMO najprościej byłoby zrobić publiczne metody typu getXXX() albo, w przypadku dziedziczenia, nadać im atrybut protected.


I tak tez zrobiłem ale nie mogę się odwołać do pol instancji klasy a z poziomu metod klasy B.
Czy dziedziczenie cos tu zmieni ?
Ew. prosiłbym o przykład takiego odwołania bo jakoś nie do konca wiem jak to mozna zrobic
Go to the top of the page
+Quote Post
KapiX
post 17.04.2008, 23:04:58
Post #6





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 4.12.2007

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


Cytat(poligon81 @ 17.04.2008, 23:58:46 ) *
I tak tez zrobiłem ale nie mogę się odwołać do pol instancji klasy a z poziomu metod klasy B.
Czy dziedziczenie cos tu zmieni ?
Ew. prosiłbym o przykład takiego odwołania bo jakoś nie do konca wiem jak to mozna zrobic


Nie wiem dokładnie, ale powinno (OOP znam tylko z C++ ;P).
Wyglądało by to tak:
Kod
class A {
protected $jakiesPole;
}

class B extends A {
function jakasMetoda() {
  $innePole = $jakiesPole;
}
}


Nie jestem pewny, czy będzie działać (z pamięci piszę).
Go to the top of the page
+Quote Post
sniezny_wilk
post 17.04.2008, 23:17:13
Post #7





Grupa: Zarejestrowani
Postów: 732
Pomógł: 80
Dołączył: 25.05.2005
Skąd: Szczecin

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


Cytat(KapiX @ 17.04.2008, 22:04:58 ) *
Nie wiem dokładnie, ale powinno (OOP znam tylko z C++ ;P).
Wyglądało by to tak:
Kod
class A {
protected $jakiesPole;
}

class B extends A {
function jakasMetoda() {
  $innePole = $jakiesPole;
}
}


Nie jestem pewny, czy będzie działać (z pamięci piszę).


hmm.. a nie tak ?:

  1. <?php
  2. class A {
  3.  protected $jakiesPole;
  4.  
  5. public function jakasMetoda() {
  6. return $jakiesPole;
  7.  }
  8. }
  9.  
  10. class B extends A {
  11.  $zmienna = parent::jakasMetoda();
  12. }
  13. ?>


Ten post edytował sniezny_wilk 17.04.2008, 23:21:21


--------------------
Go to the top of the page
+Quote Post
poligon81
post 17.04.2008, 23:18:15
Post #8





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 17.04.2008

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


Cytat(KapiX @ 18.04.2008, 00:04:58 ) *
Nie wiem dokładnie, ale powinno (OOP znam tylko z C++ ;P).
Wyglądało by to tak:
Kod
class A {
  protected $jakiesPole;
}

class B extends A {
  function jakasMetoda() {
   $innePole = $jakiesPole;
  }
}


Nie jestem pewny, czy będzie działać (z pamięci piszę).



Hm... wydaje mi sie ze to nie bedzie działać. Odwołanie bezpośrednio do pola klasy A raczej jest nie mozliwe, bo mozliwe jest wystąpienie kilku instancji klasy A wiec nie za bardzo wtedy byłoby wiadomo gdzie sie odwoływać....

Ustawiłem klase B jako dziedziczną po A. Wywołuję instancję klasy A i B, a w klasie b w jednej z metod odwołuję sie do metody klasy a (która miała by mi zwracac zmienna / tablice ) poprzez $inst_klasy_a -> get (); jednak dostaję komunikat:

Undefined variable: inst_klasy_a
Fatal error: Call to a member function get() on a non-object...
Go to the top of the page
+Quote Post
sniezny_wilk
post 17.04.2008, 23:19:50
Post #9





Grupa: Zarejestrowani
Postów: 732
Pomógł: 80
Dołączył: 25.05.2005
Skąd: Szczecin

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


Spróbuj mój przykład który podałem wyżej, jeśli nie będzie działo, podaj kawałek kodu, może tak będzie łatwiej analizować.


--------------------
Go to the top of the page
+Quote Post
Sedziwoj
post 17.04.2008, 23:23:50
Post #10





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Instancję klasy A możesz przekazywać do tych dwóch pozostałych obiektów, a i tak obiekt klasy A będzie jeden.
  1. <?php
  2. class B {
  3.  
  4.  protected $A;
  5.  public function setClassA( A $A ){
  6. $this->A = $A;
  7.  }
  8.  
  9. }
  10. $A = new A();
  11. $B = new B();
  12. $B->setClassA( $A);
  13. $C = new C();
  14. $C->setClassA( $A);
  15. ?>


Dziedziczenie wykorzystujemy kiedy jest logiczne, a nie kiedy jest nam wygodnie.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
poligon81
post 17.04.2008, 23:46:32
Post #11





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 17.04.2008

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


Cytat(Sedziwoj @ 18.04.2008, 00:23:50 ) *
Instancję klasy A możesz przekazywać do tych dwóch pozostałych obiektów, a i tak obiekt klasy A będzie jeden.
  1. <?php
  2. class B {
  3.  
  4.  protected $A;
  5.  public function setClassA( A $A ){
  6. $this->A = $A;
  7.  }
  8.  
  9. }
  10. $A = new A();
  11. $B = new B();
  12. $B->setClassA( $A);
  13. $C = new C();
  14. $C->setClassA( $A);
  15. ?>


Dziedziczenie wykorzystujemy kiedy jest logiczne, a nie kiedy jest nam wygodnie.


To jest dokładnie to o co mi chodziło.

PS. Czy mozna w jakis sposób (bez podawania parametru) wymusic by przekazanie instancji klasy A (takie jak ma miejsce w funkcji setClassA) mialo miejsce w konstruktorze klasy B (moge nawet przyjąc ze bedę zawsze tak samo nazywał instancje klasy A)

Dziekuję wszystkim jeszcze raz za okazaną pomoc...

Ten post edytował poligon81 17.04.2008, 23:59:13
Go to the top of the page
+Quote Post
Sedziwoj
post 18.04.2008, 07:21:02
Post #12





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Jest taka możliwość.
Ale właśnie specjalnie ją ominąłem, bo nie jestem do końca przekonany czy powinno się ich uczyć.
Jeden to "antywzorzec" projektowy Singleton, drugi Registry.

Trochę innych http://forumphp.nq.pl/Wzorce_projektowe_t66523.html ale to jest problematyczne zagadnienie, nawet jak się umie dobrze posługiwać obiektami (problematyczne, aby zrozumieć i dobrze stosować)


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
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 - 04:40