Keresés
Hírlevél
 
Kiemelt témák
»Hogy viszonyul ehhez a család?
»Legjobb metodika emberi relációk tárolására
»A programozó hibája, hogy törik a programját?
»Jogosultság kezelés mezőszinten
Állás/munka
»Wordpress szakértőt keresünk
»Kamu álláshirdetők listája
»Front-end fejlesztő / Sitebuilder
»DataStore Developer
»PHP programozó, webfejlesztő munkát keres
» több téma
Tudástár
Oldalon keresés 8x írja ki az eredményt
?XML-ből sok szövegmező
?Input mezőből visszakapott adat probléma
TinyMCE és az ékezetek
?Rengeteg hasonló kép betöltése gyorsan (PHP)
Ékezetes kar. nem minden táblában jól
?Shelltreeview gond
Grafikon rajzolás probléma
?Onclick= php függvény
?Egyenes megrajzolása
?Access-ből adott xml fájl kinyerése
Listázás időpont szerint
Exportálás változó könyvtárba
*Link eredményének kiolvasása
Imagemapre képet
» több téma
Társalgó
»A programozásból jól meg lehet élni?
»MFC tanulás
»Könyvet adok-veszek
»Hogy viszonyul ehhez a család?
»Nintendo wii
»Letölthető az új Rad Studio XE és Delphi XE
»Weblap véleményezés
»Játékmotor elmélet
»Informatikai bulvárlap
»Delphi-ről C++-ra váltás
» több téma
ASP  |  C#  |  C++  |  CSS  |  Delphi  |  Flash  |  HTML  |  Java  |  JavaScript  |  Pascal  |  Perl  |  PHP  |  Python  |  Visual Basic  |  Visual C++  |    »    

Tudástár

»

PHP objektum elérése objektumban

»

PHP objektum elérése objektumban

nyitotta: Drazic, idő: 2010.03.13., moderátor: moderator
  Értesítés változás esetén Felvétel kedvencekhez Küldés emailben Nyomtatható verzió

Kategóriák:Programozási nyelvek » PHP
Egyéb » Programozás-elmélet

Sorrend:
Időzóna:
Blokkméret:
Sziasztok!

Van egy X objektumom, az példányosít magában három objektumot a konstruktor függvény lefutása során, mondjuk a három objektum legyen A, B, C.

A kérdés a következő: A objektumon belül szeretném elérni , és használni például B objektum X objektumban példányosított példányát. Van néhány halvány ötletem, de elég nehézkesek, bizonyára van elegánsabb megoldás is az én elképzeléseimnél.

Köszönettel:
Drazic
Azt is írd le, hogy hány osztályod van, és melyik objektum melyik osztályhoz tartozik.

Pl: X,A,B,C egyaránt az O1 osztályba tartozik.
Pl2: X az O1 osztályba tartozik, A,B,C pedig az O2-be.
Pl3: Minden objektum más-más osztályba tartozik.

Kieg: Esetleg kitalálhatsz valami értelmes példát, mondjuk: az Autó osztály egy példánya tartalmazhatja az Akkumulátor, a Motor, és a Sebességváltó osztály egy-egy példányát.
Igazad van, ez így nem elég informatív.
Példa:
Autó osztály
példányosít három osztályt:
Motor, Váltó, Kerék.

Autó: Motor, Váltó, Kerék.

A kérdés a következő:
A Motor osztályon belül hogyan tudom elérni a Váltó objektumnak azon példányát, amit az Autó példányosított.

Senki többet harmadszor?
objektumon beül tudod hogyan kell hivatkozni php-ban?
Ez itt egy lényeges kérdés :)

objektumon belül:
$this->A->get();  //A objektum get függvényét hívod meg.
Objektumon kívül:

$X->A->get();

Másik lényeges rész, hogy a konstruktorba amikor példányosítasz akkor az X objektum valamilyen értékének add át a példányt:



public $A = null;  //lehet private is. Attól függ mit akarsz
public $B = null;
public $C = null;

function __construct(){
    $this->A = new A();
    $this->B = new B();
    $this->C = new C();
}

Ha ezt nem teszed meg akkor elfognak veszni az objektumaid a konstruktor lefutása után. Így viszont X példányosítása után megmaradnak és végig eléred amíg X létezik.
Ekkor az Auto osztály beágyazottan tartalmaz egy Motort, egy Váltót, meg egy Kereket (mondjuk az akkumulátor életszerűbb lett volna, de mindegy), de a Motor nem tartalmazhat beágyazottan sem Autót, sem Váltót, sem Kereket; az egyetlen lehetőség, ha van neki egy Autó típusú pointere (más nyelvekben: referenciája), ami NULL, ha ő nincs beszerelve egy autóba, egyébként meg arra az autóra mutat, amelyikben ő benne van...
Mondjuk egy Motor.setAuto/Motor.getAuto metóduspárban lehetne gondolkozni.
Ez így mind szuper, és rendben is van.
Ez nem is okozna gondot. Profhun példájánál maradva:

class A{
protected B_object;
//...
function __construct(){
  //hogyan tudom itt elérni A-nak azon példányát, amit X-ben
  //példányosítottam?
}
}
class X{
public $A = null;  //lehet private is. Attól függ mit akarsz
public $B = null;
public $C = null;

function __construct(){
    $this->A = new A();
    $this->B = new B();
    $this->C = new C();
}
}

De akkor marad az, hogy minden "alobjektumba" beletolom a referenciát a konstruktorán keresztül példányosításkor.
Mindenképpen a vezérlő szerkezetben kell megtenned.
Egyik osztályból nem fogsz belelátni a másik osztályba csak úgy
De azt meg tudod csinálni, hogy az osztályokon kívül példányosítasz, és minden osztálynak azt adod át a konstruktorba referencia szerint. Azaz:

var $A = new A();

class X{
  function __construct(){
    global $A;
    $this->A = &$A; //referencia szerinti átadás.
  }
}

class B{
  function __construct(){
    global $A;
    $this->A = &$A; //referencia szerinti átadás.
  }
}

Ezzel a módszerrel ugyanazt a példányt fogod használni az összes osztályodon belül.
Lehet fújozni, de mi cégnél SQL osztálynál csináljuk ezt. Így elég belőle 1 példány és minden osztályból elérjük.
Köszönöm mindenkinek a figyelmet, és a válaszokat.
Profhun utolsó válaszát fogadnám el válaszként.
Köszönöm.
global-t ne használj soha, sőt, nyugodtan felejtsd el, hogy létezik!

Két megoldás van:

class X {

  public $a;
  public $b;
  public $c;

  public function __construct() {
    $this->a = new A($this);
    $this->b = new B($this);
    $this->c = new C($this);
  }
}

class A {

  protected $_x;

  public function __construct(X $x) {
    $this->_x = $x;
  }
}

A publikus $a, $b és $c nem igazán szerencsés, és talán szebb a proxy objektum (referenciák tárolására használt objektum) használata:

class X {

  protected $_a;
  protected $_b;
  protected $_c;

  public function __construct() {
    $proxy = new stdClass();
    $this->_a = $proxy->a = new A($proxy);
    $this->_b = $proxy->b = new B($proxy);
    $this->_c = $proxy->c = new C($proxy);
  }
}

class A {

  protected $_proxy;

  public function __construct(stdClass $proxy) {
    $this->_proxy = $proxy;
  }
}

Proxy objektumokkal lehet szabályozni (külön proxy objektumok létrehozásával) azt is, hogy melyik objektumnak mit adunk át, például, hogy a visszapillantó-tükör ne tudja beindítani a motor-t, és a helyzetjelző lámpa ne tudjon váltani.
SQL osztálynál sem globalt, hanem singleton-t kell használni.
Köszönöm Sanyiii! Természetesen GLOBAL-t nem használok.
A proxy objektum jó ötlet. :) Köszönöm
vannak kétségeim...
Meg azért ne boruljunk el annyira mint a java-sok. :)
Maradjunk meg az egyszerűségnél és a hatékonyságnál.

Az általad felvázolt módszer meg nem hiszem, hogy kielégíti az eredeti probléma megoldását, hogy ugyanazt a példányt tudja használni minden osztályon belül. Nem szeretek globálozni énse, de vannak esetek amikor nem tudod elkerülni.
izlések és pofonok
Az SQL objektum global-ba helyezése például feleslegesen létrehoz egy nyitott kapcsolatot akkor is, ha a program futása során nincs is rá szükség. Szemben egy singelton mintával, ahol a legelső használat során jön létre az sql kapcsolat.

Egyébiránt nem tudok olyan esetet, ahol a global használatos.

Ráadásul a global $auto használata a te példádban csak egy auto példány létezését feltételezi egyszerre, ami egy autókereskedésben például elég kevés.

Amúgy nem hiszem, hogya a java oo-ja különb lenne, a php meg az igénytelenebb, és ezzel a szemlélettel kellene eljárni.

Ezen el lehet filozofálni :)
A lényeg hogy 1db SQL kapcsolat legyen, és ne kismillió osztályonként. Az meg hogy mikor jön létre a kapcsolat megint szinte érdektelen kis forgalmú oldalaknál. Egy jól megírt oldal php lefutási ideje 0,1 mp, és azon már van minden.

Másik kérdés, hogy a php mire van használva, megjelenítés, adatfeldolgozás???

Szóval lehet róla sokat dumálni. De már kezd a tököm ki lenni tőle amikor kollegákkal elmegyek ebédelni és csak a programozásról beszélnek ott is.

A pszicho órák számlát kinek küldjem? :D
Belépés
E-mail cím:
Jelszó:

RSS források
-Hírek
-Cikkek
-Fórumok
-Állás/munka
Top pontgyűjtők
»Micu1.030
»Interlock280
»mezofi150
»Pitta_100
»Frostech0100
»szbzs.2100
»Riha60
»Akhiles50
»mrchandra50
»Bakter50
Top wikieditorok
»Sting
»Doi
»FlamingClaw
»Argathron
»Csaboka2
»Vodka
»Joexy
»Ivn
»Balucinho
»Kelemzol
» ugrás a wikire
A nap kifejezései
»Algoritmus
»Hogyan kezdjem el
»Perl
» ugrás a wikire
Hírek
»Megérkezett a PostgreSQL 9.0 kiadásra jelölt változata
»Letölthető az új Rad Studio XE és Delphi XE
»Function-X digitális művészeti találkozó és demoscene party
»Webfejlesztőknek szóló közösségi oldalt indított a Microsoft
»Letölthető a hardvergyorsított Chrome 7 első fejlesztői kiadása
» több hír
PC Fórum hírek
»Itt az első kép az AMD nyolcmagos processzoráról
»"Szuperdizájnos" érintő-egeret mutatott be a Microsoft
»Szabadalmaztatta a számítógép kikapcsolását a Microsoft
»Vírusriadót váltott ki a webezőknél a Google
»Ingyen iWiW-ezhetnek mobiljaikról a T-Mobile-osok
»Automatikusan kiválogatja legfontosabb leveleink a Google
»OOo4Kids - ingyenes Office csomag gyerekeknek
»Új, gyorsabb Core i3 és Pentium processzorokat jelentett be az Intel
Tagi blogok
»PSP
»Első Programozó
»USB
»PHP, mint sablonmotor egyszerűen