Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
jnt
HV Guru

liitunud: 10.05.2005
|
11.03.2009 10:38:36
Objektiga tegelemine väljaspool klassi (PHP, OOP) |
|
|
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.
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 |
|
 |
kapa24
HV vaatleja
liitunud: 23.01.2003
|
11.03.2009 10:50:33
|
|
|
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 |
|
 |
airm
HV Guru
liitunud: 26.02.2003
|
11.03.2009 10:52:44
|
|
|
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 |
|
 |
jnt
HV Guru

liitunud: 10.05.2005
|
11.03.2009 12:57:38
|
|
|
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.
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 |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
11.03.2009 14:32:34
|
|
|
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 |
|
 |
hanz
HV kasutaja

liitunud: 31.03.2005
|
11.03.2009 20:26:50
|
|
|
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  |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
12.03.2009 00:07:51
|
|
|
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 |
|
 |
jnt
HV Guru

liitunud: 10.05.2005
|
12.03.2009 00:13:48
|
|
|
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.
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 |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
12.03.2009 00:32:30
|
|
|
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 |
|
 |
andiweb
HV vaatleja
liitunud: 16.04.2003
|
12.03.2009 01:28:15
|
|
|
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 |
|
 |
jnt
HV Guru

liitunud: 10.05.2005
|
12.03.2009 07:59:44
|
|
|
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.
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 |
|
 |
Ohohh
Kreisi kasutaja

liitunud: 13.09.2003
|
12.03.2009 14:01:49
|
|
|
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 |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
12.03.2009 14:19:02
|
|
|
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 |
|
 |
gynterk
HV kasutaja
liitunud: 17.01.2004
|
12.03.2009 21:57:07
|
|
|
Sa püüad mingit errorreportingvidinat leiutada? link.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
jnt
HV Guru

liitunud: 10.05.2005
|
13.03.2009 08:38:18
|
|
|
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.
_________________ Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda.
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 |
|
 |
|