Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [oop] wywolanie jednej klasy z poziomu drugiej
Forum PHP.pl > Forum > PHP > Object-oriented programming
poligon81
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
sniezny_wilk
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 ?
poligon81
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...
KapiX
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.
poligon81
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
KapiX
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ę).
sniezny_wilk
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. ?>
poligon81
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...
sniezny_wilk
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ć.
Sedziwoj
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.
poligon81
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...
Sedziwoj
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ć)
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.