Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Objektiga tegelemine väljaspool klassi (PHP, OOP) märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga

sõnum 11.03.2009 10:38:36 Objektiga tegelemine väljaspool klassi (PHP, OOP) vasta tsitaadiga

Tervist, nimelt liiga palju kogemusi OOP alal pole ja kerge google mind hetkel ei aidanud, seega mõtlesin, et küsiks siit väheke nõu. Oletame, et mul on selline klass:
<?php
class klass1{
function klass1(){}
function kuva($str){
  echo $str;
}
}
?>


ja tollest tehakse siis uus objekt:

<?php
$asi=new klass1;
?>


Nüüd aga tahaks peale seda teise klassi seest selle $asi ligi pääseda.
<?php
class klass2{
function klass2(){
  //Siia siis kuidagi kood, et saaks $asi'le ligi... mingi $asi->kuva('Olen klass2'); vms
}
}



Tähtis on see, et $asi objekt on varem tehtud ja mul on vaja toda objekti kasutada... Kuidas tollele aga klassi seest ligi pääseda?

_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
kapa24
HV vaatleja

liitunud: 23.01.2003




sõnum 11.03.2009 10:50:33 vasta tsitaadiga

Kaks võimalus,

Annad parameetrina kaasa

class Klass2 {
    public function __construct(klass1 $asi) {
        $asi->kuva('keeks');
    }
}


Kutsud välja kui globaalse muutuja

class Klass2 {
    public function __construct() {
        $GLOBALS['asi']->kuva('keeks');
    }
}
tagasi üles
vaata kasutaja infot saada privaatsõnum
airm
HV Guru

liitunud: 26.02.2003




sõnum 11.03.2009 10:52:44 vasta tsitaadiga

Annad ette funksiooni muutujana selle...
function klass2($aaa){ $aaa->kuva();}

väljapoolt:
$asi=new klass1;
$bbb=new klass2($asi);
Kommentaarid: 56 loe/lisa Kasutajad arvavad:  :: 2 :: 1 :: 50
tagasi üles
vaata kasutaja infot saada privaatsõnum
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga

sõnum 11.03.2009 12:57:38 vasta tsitaadiga

kapa24, esimene variant vist ei sobi, kuna seal vist tehakse uus objekt... mul aga vaja kasutada just nimelt juba olemas olevat. Kuidas teisel variandil see global tekitada? või on automaatselt kõik klasside välised muutujad globalid klassi sees?

airm, Ei tahaks kohe kuidagi argumendina kaasa seda anda, kuid kui vaja, ei jää muud üle...

_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 11.03.2009 14:32:34 vasta tsitaadiga

Klasside välised muutujad on automaatselt globalid, seega saad $GLOBALS['asi']->kuva(); moodusega ligi või näiteks ka nii:
function klassifunc() {
global $asi;
$asi->kuva();
}

_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
hanz
HV kasutaja
hanz

liitunud: 31.03.2005




sõnum 11.03.2009 20:26:50 vasta tsitaadiga

jnt kirjutas:
kapa24, esimene variant vist ei sobi, kuna seal vist tehakse uus objekt... mul aga vaja kasutada just nimelt juba olemas olevat.

kui ma ei eksi, siis see oleneb PHP versioonist: PHP5 puhul luuakse vaid reference, koopia loomiseks pead kasutama clone'i. PHP4 puhul luuakse vist tõesti objekti koopia, referencei loomiseks peab kasutama & märki.

_________________
Lahedad mängud icon_wink.gif
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 12.03.2009 00:07:51 vasta tsitaadiga

Globaalsete muutujate kasutamisest tasuks enamusel juhtudest hoiduda. Kui neid siiski kasutada, siis peaks olema hea põhjendus.

Kuid siin oleks tarvis rohkem konteksti. Teadmata, miks Klass2 tahab Klass1-te kasutada, on raske mingit asjalikku nõu anda.

_________________
Mõistus otsas? Pane pinusse...
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga

sõnum 12.03.2009 00:13:48 vasta tsitaadiga

Idee on pmst selles, et mul on nagu nö teadete klass, kuhu siis nagu lisatakse teateid ja hiljem kuvatakse. Ja mul on moodulid cms'il, mis on klassid... Oleks vaja, et moodulid suudaksid kasutada eelpool valmis loodud teadete objekti...
_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 12.03.2009 00:32:30 vasta tsitaadiga

Siis olekski kõige õigem kui sa annaksid selle teadete klassi moodulile konstruktori või mingi muu meetodi kaudu ette.

Mainisid enne, et:

tsitaat:
Ei tahaks kohe kuidagi argumendina kaasa seda anda


Miks sulle see argumendi variant siis ei sobi?

_________________
Mõistus otsas? Pane pinusse...
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
andiweb
HV vaatleja

liitunud: 16.04.2003




sõnum 12.03.2009 01:28:15 vasta tsitaadiga

nene kirjutas:
Siis olekski kõige õigem kui sa annaksid selle teadete klassi moodulile konstruktori või mingi muu meetodi kaudu ette.

Mainisid enne, et:

tsitaat:
Ei tahaks kohe kuidagi argumendina kaasa seda anda


Miks sulle see argumendi variant siis ei sobi?


Minu arust peaks ka globaalsete muutujate kasutamisest hoiduma, argumendi variant peaks olema kõige õigem, sest siis on klassid omavahel ikkagi seotud ja säilib vähemalt minu jaoks OOPi põhimõte.
tagasi üles
vaata kasutaja infot saada privaatsõnum
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga

sõnum 12.03.2009 07:59:44 vasta tsitaadiga

nene, argumendiga on selline lugu, et mul on nagu klass "moodul" ja siis on mooduli enda klass, mis siis extendib sealt klassist "moodul". Kui extenditud moodul välja kutsuda, siis ei käivitata klassi "moodul" konstruktorit ju? vähemalt mitte "moodul" nimelist funktsiooni/meetodit. Samas tahaks ma moodulite enda osa teha võimalikult puhta, et kõik vajalik oleks klassis "moodul" juba tehtud. Kui hakata argumendiga kaasa andma stuffi, siis peab tekitama mooduli kirjutamise klassi teatud kohustuslikud read, mida ma ei sooviks... (hetkel ainus kohustuslik asi on klassi nimi + et oleks juures "extends moodul")
_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ohohh
Kreisi kasutaja
Ohohh

liitunud: 13.09.2003




sõnum 12.03.2009 14:01:49 vasta tsitaadiga

jnt, kui sa oled objekti juba loonud (näiteks kusagil initsialiseerimis funktsioonis) ja annad selle parameetrina teisele klassile ette, siis ei tomu enam mingit konstrukotri välja kutsumist, kuna seda tehti objekti loomisel.

Programmi toimimse seisukohalt ei ole mingit vahet, kas annad ette parameetrina või kasutad globaalset muutujat. Kui sa aga kasutad ohtralt globaalseid muutujaid, läheb varsti kogu koodi haldus käest ära.
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 12.03.2009 14:19:02 vasta tsitaadiga

Antud juhul ei olnud probleemiks mitte see kas Klass1 konstruktorit kutsutakse millalgi välja või ei, vaid et kuidas Klass2 seest kasutada klass1 objekti, ilma et peaks seda parameetrina ette anda.

Üks võimalus on kasutada näiteks kolmandat klassi, kus sees on kapseldatud private static $asi; ja funktsioonid public static function GetAsi() ja public static function SetAsi($asi)
Ja siis saad oma teistes klassides kätte nii: Staatilineklass::GetAsi()->kuva(); või $asi = Staatilineklass::GetAsi(); $asi->kuva();

Säilib kapseldus (mis siis et staatiline klass ei ole formaalselt objekt, kuid sisuliselt on ikkagi tegu mingil määral objektiga, lihtsalt singleton tüüpi) ning ei kasuta ka globaalseid muutujaid ega ka parameetriga etteandmist funktsioonidele/klassile.
Ainus asi on see, et töötab ainult php 5 puhul pluss pead alati selle static klassi definitsiooni ennem sisse includema kuna muidu Staatilineklass::GetAsi kasutamine annab fatal errori.

Näidis:

class StaatilineHoidla {
    private static $asi;
    public static function GetAsi() {
        return self::$asi;
    }
    public static function SetAsi($asi) {
        self::$asi = $asi;
    }
}
StaatilineHoidla::SetAsi(new Klass1());
class Klass2{
    function Klass2(){
        $asi = StaatilineHoidla::GetAsi();
        $asi->kuva('tere');
        //või saab ka nii
        StaatilineHoidla::GetAsi()->kuva('tere2');
    }
}

Ja kui sul on ainult Klass1 puhul selline asi vaja teha, siis võid needsamad static asjandused Klass1 sisse tõsta ja oma koodise teed siis Klass1::SetAsi($asi); ja Klass1::GetAsi();

_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
gynterk
HV kasutaja

liitunud: 17.01.2004




sõnum 12.03.2009 21:57:07 vasta tsitaadiga

Sa püüad mingit errorreportingvidinat leiutada? link.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga

sõnum 13.03.2009 08:38:18 vasta tsitaadiga

gynterk, errorite kuvamine/kogumine on ka mõeldud asja sisse, kuid see ple ainus... Lisaks tulevad ka paljud muud teated, kasvõi sellised teated, nagu "Parool on muudetud", kui seda admin paneelist teha. Seega tegemist on nö üleüldise teadete klassiga. (Tegelikult antakse koos teatega veel juurde välja kutsuja nimi (moodul vms) ja "raskusaste", millega saab siis vajadusel üht-koma-teist kuvada/kuvamata jätta)

inzinz, hmm, läks natuke hetkel keeruliseks, aga üritan end läbi närida sellest. icon_wink.gif

_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Objektiga tegelemine väljaspool klassi (PHP, OOP)
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.