Kuinka toteutan seuraavan tilanteen olion luonnin yhteydessä:
public function __construct($arvo) { $this->arvo = $arvo; } public function __construct() { $this->arvo = 0; }
eli jos argumentti annetaan, käytetää sitä. Jos argumenttia ei anneta käytetään jotain oletusarvoa.
PHP:ssä ei voi ylikuormittaa funktioita. Voit hoitaa tuon ihan tavallisella oletusargumentilla:
<?php public function __construct($arvo = 0) { $this->arvo = $arvo; }
Toinen vaihtoehto olisi hakea annetut argumentit vaikka kutsulla func_get_args() ja tarkistaa siitä, montako tuli.
Hiuksia halkova sivuhuomautus: PHP:ssä ylikuormitus tarkoittaa käytännössä samaa kuin useissa oliopohjaisissa kielissä metodien ylikirjoittaminen.
Kiitoksia.
Tuolla overloading käsitteellä juuri etsin vastausta php manuaalista, mutta sen toiminta ei ollutkaan ihan sitä, mitä kuvittelin sen olevan :D
-----
Pistän perään vielä yhden kysymyksen:
Olisiko nuo kaikki muuttujat, mitä aikoo käyttää luokan sisällä, hyvä esitellä tuossa luokan alussa? Esimerkkinä tuo public $dir. Mitä tuosta muuttujien esittelystä hyötyy? Alla oleva toimii, mutta epäilen onko tuo hyvän ohjelmointitavan mukaista.
Jäsenmuuttujia voidaan esitellä missä tahansa luokkablokin sisällä, mutta selkeintä ne on esitellä siellä alussa. Esimerkistä muuttaisin $dir
-jäsenen protectediksi, käyttäisin hakemiston selaukseen jotain hakemistoiteraattoria ja muuttaisin $file
-jäsenen paikalliseksi, koska sitä ei käytetä muualla luokassa.
Etuja esittelyistä ovat koodin ymmärrettävyys ja olio-ohjelmoinnin periaatteiden toteutuminen. Luokan jäsenet on helppo tarkistaa yhdestä paikasta. Ilman esittelyä jäsenestä tulee aina julkinen, jolloin menetetään kaikki suojamääreiden tuomat edut.
Omassa koodissasi toinen funktio sisältää jäseniä, joita ei käytetä muualla, joten olisi joka tapauksessa parempi käyttää paikallisia muuttujia.
tsuriga kirjoitti:
...käyttäisin hakemiston selaukseen jotain hakemistoiteraattoria ja ...
Mieleeni tulee kaksi vaihtoehtoa:
- Luon ensin omasta luokastani olion ja passaan tuon hakemistoiteraattori-olion sen jälkeen jollekkin oman olioni jäsenfunktiolle
- tai luon tuon hakemistoiteraattori-olion automaattisesti oman luokkani sisällä
Kumpi on parempi?
Herää myös kysymys, että jos tuota hakemisto-iteraattoria tulee käyttämään useamman jäsenfunktion siällä niin mitenkä tuo kannattaa toteuttaa?
Jos iteraattori on käytössä useammassa luokassa, vie se parametrina. Jos sitä käytetään useammassa metodissa luokan sisällä, tee siitä luokan jäsen.
Selvä Kiitoksia. Viimeinen kysymys vielä.
Ylläolevassa koodipätkässä käytin:
olisiko viisaampaa käyttää funktion sisällä kuitenkin:
Handleen on siis tarkoitus tallentaa vain tilapäisesti tietoa eikä tuota muuten tarvita missään.
jos testini pitävät kutinsa niin alempaa versioo käytettäessä tuohon handleen ei pysty viittaamaan oliosta käsin mitenkään toisin kuin ylempää käytettäessä $this->handle:lla. Tuohon ei tarvitsisi siis päästä oliosta käsiksi ollenkaan, koska handlen antama tieto on aivan turhanpäivästä.
Lyhyt vastaus: Joo.
Pidempi vastaus: $this
viittaa olioon, jonka sisältä kyseinen lausahdus löytyy. $this->foo
viittaa siis luokkamuuttujaan foo. Aivan kuten arvelitkin, jos muuttuja on käytössä vain yhdessä metodissa niin ei sen tarvitse koko luokalle näkyä.
Kiitos tsuriga.
Aihe on jo aika vanha, joten et voi enää vastata siihen.