ugrás a tartalomhoz

PHP OOP kérdés? Leszármazott osztály tagfüggvényeinek elérése más oszályokból.

reptile27 · 2009. Jún. 3. (Sze), 19.33
Sziasztok!

Adott 3 osztály. A, B, C

Az "A" osztály lényegtelen mit tartalmaz.
A "B" osztály leszármazottja az A osztálynak, melynek van egy tagfüggvénye pl.:"F".
A kérdés a következő: Hogyan tudom elérni "C" osztályból, "B" osztály "F" tagfüggvényét?

class A{
 //empty
}
class B{
 function F(){
  //ezt szeretném elérni
 }
}
class C{
 //itt kellene elérnem "B" oszt. "F" tagfüggvényét
}
Egy példával elmagyarázott választ nagyon megköszönnék!
Előre is köszi!

Reptile
 
1

Pl

inf · 2009. Jún. 3. (Sze), 19.55
ha statikus:
B::F()
ha nem statikus, akkor reflectionben nézz körül

egyébként ha ilyet kell csinálnod, akkor rosszul tervezett a programod, szülőből nem szokás gyerek utasításait elérni... ha ilyen van, akkor inkább fordított a helyzet, és a mostani gyerek osztályodnak kéne szülőnek lenni
2

senki sem mondta, hogy C leszármazottja B-nek...

amonrpg · 2009. Jún. 3. (Sze), 20.22
Ha statikus, akkor ahogy inf3rno mondta B::F();
Ha nem statikus, akkor a C osztályban valahol csinálsz egy példányt, és akkor úgy.
$cObj = new B();
$cObj->F();
4

Megoldottam! :))

reptile27 · 2009. Jún. 3. (Sze), 21.39
Köszönöm a válaszokat!
Megoldottam. Paraméterként átadtam...

class A{
	// Empty
}
class B extends A{
	function F(){
		echo "Elérve!";
	}
}
class C{
	var $obj_B;
	// Const
	function C(& $obj_b){
		$this->obj_B = & $obj_b;
	}
	function display(){
		$this->obj_B->F();
	}
}

$obj_b = & new B();
$obj_c = new C(& $obj_b);
$obj_c->display();
8

hiba

vbence · 2009. Jún. 4. (Cs), 10.34
Ha jól tudom a PHP mai állása szerint ez már hiba:
$obj_c = new C(& $obj_b);
11

helyesen

vbence · 2009. Jún. 5. (P), 10.27
Helyesen csak így van:

$obj_c = new C($obj_b);
... mivel az cím szerinti (referencia szerinti) átadást jelző & oprtátor a függvénydeklarációban úgy is szerepel.
12

Köszi! :)

reptile27 · 2009. Jún. 5. (P), 15.25
Igen igazad van. Köszi szépen! :))
9

php5 oop eseten

carstepPCE · 2009. Jún. 4. (Cs), 11.29
akar a C osztalyodban

  function C( B $obj_b ) {
    ...
  }
is hasznalhatsz, tipuselleneorzes vegett, hogy tenyleg B osztalyt kaptal e.

-cs-
Sanyi
10

Jó látni, hogy azért még foglalkoztok a témával... :)

reptile27 · 2009. Jún. 5. (P), 05.21
Az utobbi két hozzászólást nem nagyon értem? :(
Át tudnátok írni az általam írt kódot, hogy helyes legyen, mert így eléggé össze zavart amit írtatok. Nem szeretném ha idővel lehalna az oldal a lámaságom miatt!?
Jelenleg PHP 5.1.4 fut nálam és semmi hibát nem tapasztaltam.
13

...

carstepPCE · 2009. Jún. 5. (P), 17.17
Az 5.1 php-tol bevezettek a "Type Hinting"-t, ami azt jelenti, hogy megadhatod a fuggvenyed parametereinek milyen osztalyu objektumot varnak vagy esetleg tomb tipust az adott helyen. Nem objektum es tomb tipusu adattipusokra ez nem ervenyes. Ha ezt nem tudod, nem leszel lama, csak tajekoztataskent irtam, mert ez segithet pontosabb kodot irni, ezaltal kevesebb ellenorzest kell beepitened a programodba.

Amit meg erdemes itt megemliteni, hogy interface tipust is meg tudsz adni.

referencia

-cs-
Sanyi
5

:-)

inf · 2009. Jún. 3. (Sze), 22.13
Haha, erre nem gondoltam, mondjuk a kérdés sem volt szerintem elég konkrét.
7

Igen

reptile27 · 2009. Jún. 3. (Sze), 22.23
Valóban, de nem akartam túlbonyolítani a dolgot. Viszont a válaszod eszembe juttatot egy ilyen megoldást. Még1x köszi! ;) :)
3

Lehet...

reptile27 · 2009. Jún. 3. (Sze), 20.30
Szia! Köszi a gyors választ! :)
Az meglehet, hogy rosszul tervezett.
"A" osztály az adatbázisal kommunikál.
"B" pedig egy konkrét műveletet hajt végre az adatbázison.
"C" adatokat ellenőriz, melyhez szükségem lenne "B" egy adott függvényére.
Sorry, hogy nem mellékelem a kódot, de többszáz sor kódot kellene beillesztenem, hogy érthető legyen. A Reflection ben nem találtam olyan példát, ahol egy szülőosztályból érnék el egy másik szülő leszármazottjának metodusát.
Mégegyszer köszi a választ! :)

Elnézést a kódban hibát követtem el!!!

class B extends A{
function F(){
//ezt szeretném elérni
}
}
6

Én néztem el..

inf · 2009. Jún. 3. (Sze), 22.18
Nem, ez így, én néztem be, mert nekem az jött le, hogy a szülőből akarod elérni a gyereket osztály szinten. Viszont az osztályokat példányosítani szokás, és az objektumok szokták elérni egymást, nem az osztályok, ezt értettem félre.