[PHP] OOP - predani hodnoty vlastnosti podrizene tride

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod -b3h- 6. 9. 2008 11:27

Zdravim Vas,

sice v PHP programuji nejaky ten rok, ale clovek se musi ucit novym vecem, tak jsem se zameril na OOP, ktere jsem do ted nejak zvlaste nedelal. Dnes pri zkouseni, jsem narazil na jeden:

Kód: Vybrat vše
<?php

class trida1 {

  public $promenna = 10;

  function __construct() {
    new trida2;
  }

}

class trida2 {

  function __construct() {
    print $this->promenna;
  }

}

new trida1;

?>


Proste a jednoduse, chci aby mi trida2 vypsala hodnotu vlastnosti $promenna tridy1, jak to udelam? zkousim vsechno mozne ale nejak bez uspechu. Asi by mozna byla alternativa predat pri vytvareni instance parametr s prave touto promennou, ale teto moznosti bych se chtel vyvarovat, je to tedy nejak jinak mozne vyresit?
-b3h-
Junior

Odeslat příspěvekod Wikan 6. 9. 2008 11:52

Bez toho, aby ses na objekt nejak odkazal, to nepujde.
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod -b3h- 6. 9. 2008 12:21

Wikan píše:Bez toho, aby ses na objekt nejak odkazal, to nepujde.


Dobre, co tedy navrhujes?
-b3h-
Junior

Odeslat příspěvekod Wikan 6. 9. 2008 12:25

Bud to predat jako parametr, nebo mit v tride2 public property typu trida1.
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod -b3h- 6. 9. 2008 12:39

Wikan píše:Bud to predat jako parametr, nebo mit v tride2 public property typu trida1.


Mohl by jsi blize rozvest tu druhou moznost?
-b3h-
Junior

Odeslat příspěvekod Wikan 6. 9. 2008 15:57

Co na tom chces rozvest?
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod gandor 6. 9. 2008 19:20

takze 1,
to "this" znamena ze sa odkazujes na premennu v danom objekte (t.j. ked v triede 2 nemas definovanu $promenna tak $this->promenna by vobec nemal fungovat).
2,
ak narabas s 2 triedami tak by bolo vhodne obidve vytvorit (inac je to ako chciet sa odkazovat na definiciu funkcie beztoho aby si tu danu funkciu "otvoril" (pouzil) )
Kód: Vybrat vše
$t1=new trieda1();
$t2=new trieda2();

3, ak chces ziskat hodnotu premennej z triedy 1 (a mas ju vytvorenu a v oboch je definovana dana premenna) a vlozit ju do triedy 2 tak to robis nejak takto:
Kód: Vybrat vše
$t2->premenna=$t1->promenna;


dufam ze som niekde nespravil preklep lebo som to netestoval... :)
gandor
Mírně pokročilý

Odeslat příspěvekod Nargon 6. 9. 2008 19:30

Mno, a nebo tridu2 vytvorit dedenim od tridy1.
Tj asi neco takoveho to:
Kód: Vybrat vše
<?php
class trida1 {
  public $promenna = 10;
  function __construct() {
  }
}
class trida2 : trida1 {
  function __construct() {
    print $this->promenna;
  }
}
new trida2;
?>

Ale v PHP jsem celkove delal trosku. A OOP jsem v nem nedelal vubec, tak si nejsem jistej, jestli ten zapis je dobre.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod gandor 6. 9. 2008 19:44

nuz napisal si to zle (teda minimalne to ma 2 zapisi a ten tvoj som este nikdy nevidel)
ked inheritujes tak zapis je takyto:
class trida2 extends trida1
v danom pripade by mala trieda 2 obsahovat vsetko co trieda 1 (pozor ale na prava, nepamatam si ako je to s premennymi deklarovanymi ako privat a pod....)
gandor
Mírně pokročilý

Odeslat příspěvekod wojta 6. 9. 2008 20:18

private - nemá přístup nic, kromě té dané třídy, ani potomci
protected - mají přístup potomci
public - má přímo přístup zvenčí, což se nějak u proměnných nedoporučuje, spíš použít nějakou formu getterů/setterů
C:\>ver
MS-DOS Version 5.00
wojta
Pokročilý
Uživatelský avatar

Odeslat příspěvekod -b3h- 6. 9. 2008 20:50

gandor píše:takze 1,
to "this" znamena ze sa odkazujes na premennu v danom objekte (t.j. ked v triede 2 nemas definovanu $promenna tak $this->promenna by vobec nemal fungovat).
2,
ak narabas s 2 triedami tak by bolo vhodne obidve vytvorit (inac je to ako chciet sa odkazovat na definiciu funkcie beztoho aby si tu danu funkciu "otvoril" (pouzil) )
Kód: Vybrat vše
$t1=new trieda1();
$t2=new trieda2();

3, ak chces ziskat hodnotu premennej z triedy 1 (a mas ju vytvorenu a v oboch je definovana dana premenna) a vlozit ju do triedy 2 tak to robis nejak takto:
Kód: Vybrat vše
$t2->premenna=$t1->promenna;


dufam ze som niekde nespravil preklep lebo som to netestoval... :)


Diky, to me nenapadlo, neni to spatny napad ;-)

Abych pravdu priznal, nejak nemuzu OOP v PHP prijit na chut, do ted jsem vse programoval pomoci funkci v jednom souboru a ty jsem spolu nejak provazal a volal. Ale kdybych to chtel predelat do OOP tak mi to prijde ze bych tim mohl vytvorit tak max. jednu tridu, coz mi zase prijde zbytecne.
-b3h-
Junior

Odeslat příspěvekod ondrad 6. 9. 2008 21:13

OOP je potreba prijit na chut. Pocitej s tim, ze ze zacatku budes vytvaret priserne bastly. Ale jak se do toho dostanes a pochopis co a jak, tak uz nebudes chtit zpet.
ondrad
Junior

Odeslat příspěvekod gofry 6. 9. 2008 21:13

ad pôvodný príspevok: Doporučujem prečítať si nejakú teóriu o objektovom programovaní a k čomu je to vôbec dobré. Mám totiž pocit, že stále rozmýšľaš o programovaní procedurálnym štýlom (vychádzam z tvojho kódu). Bez teórie nikdy nevyužiješ silu OOP, pretože OOP nie je o zápise kódu, ale o úplne inom spôsobe rozmýšľania o programovaní.

Celkom dobre vyzerá seriál na interval.cz: Objektově orientované programování (OOP) v PHP.
gofry
Junior
Uživatelský avatar

Odeslat příspěvekod ondrad 6. 9. 2008 21:28

Jo, kdyz si to ted znova ctu, tak gofry asi uhodil hrebicek presne na hlavicku. Zrejme uplne nechapes co a proc je cilem OOP a co jsou to vlastne objekty a jak se s nimi pracuje a snazis se na to naroubovat proceduralni pristup. Takze taky doporucuju nejdriv poradne nastudovat teorii.
ondrad
Junior

Odeslat příspěvekod -b3h- 6. 9. 2008 21:48

gofry píše:ad pôvodný príspevok: Doporučujem prečítať si nejakú teóriu o objektovom programovaní a k čomu je to vôbec dobré. Mám totiž pocit, že stále rozmýšľaš o programovaní procedurálnym štýlom (vychádzam z tvojho kódu). Bez teórie nikdy nevyužiješ silu OOP, pretože OOP nie je o zápise kódu, ale o úplne inom spôsobe rozmýšľania o programovaní.

Celkom dobre vyzerá seriál na interval.cz: Objektově orientované programování (OOP) v PHP.


Presne tak, jsem zvykly programovat proceduralne, ale chcel bych nejaky zpusobem preucit na OOP. Mam koupenou knihu Mistrovstvi v PHP 5 a tam mam i prectenou kapitolu o OOP, ale nejak i presto vsechno mi to nejak nejde na rozum protak ci ona, proceduralne mi to prijde jednodussi. Ale mrknu na ten link co jsi sem dal.
-b3h-
Junior

Odeslat příspěvekod gofry 6. 9. 2008 22:05

Nie každý problém je vhodné riešiť pomocou OOP, na niektoré veci je to vyslovene nevhodné.

Pozeral som podrobnejšie na ten odkaz, čo som ti dal a asi nebude úplne vhodný na nabratie samotnej teórie. Skôr mi príde, že ukazuje nejaké OOP postupy v PHP a k tomu spomenie nejakú teóriu, ale bez širšieho kontextu.
gofry
Junior
Uživatelský avatar

Odeslat příspěvekod gofry 6. 9. 2008 22:28

Tak som našiel dostatočne teoretické materiály a dokonca v češtine:

Úvodní pojmy objektového programování

Objektově orientované programování v praxi
gofry
Junior
Uživatelský avatar

Odeslat příspěvekod -b3h- 7. 9. 2008 17:59

Dekuji, hned se na to mrknu.
-b3h-
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků