Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: php / olio

Sivun loppuun

Cartter [01.12.2009 23:51:50]

#

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.

Metabolix [01.12.2009 23:53:23]

#

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.

tsuriga [02.12.2009 10:48:08]

#

Hiuksia halkova sivuhuomautus: PHP:ssä ylikuormitus tarkoittaa käytännössä samaa kuin useissa oliopohjaisissa kielissä metodien ylikirjoittaminen.

Cartter [02.12.2009 22:54:17]

#

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.

<?php

    class File {

        public $dir;

        public function __construct($dir = '/') {

            $this->dir = $dir;
        }

        public function display() {

            $this->handle = opendir($this->dir);

            while (($this->file = readdir($this->handle)) !== false) {

                echo $this->file;
            }
        }

    }

    $file = new File('/var/www/');

    $file->display();

?>

tsuriga [03.12.2009 11:37:05]

#

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.

Metabolix [03.12.2009 11:40:33]

#

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.

Cartter [04.12.2009 00:24:27]

#

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?

tsuriga [04.12.2009 00:26:38]

#

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.

Cartter [08.12.2009 01:40:13]

#

Selvä Kiitoksia. Viimeinen kysymys vielä.

Ylläolevassa koodipätkässä käytin:

<?php
       $this->handle = opendir($this->dir);
?>

olisiko viisaampaa käyttää funktion sisällä kuitenkin:

<?php
       $handle = opendir($this->dir);
?>

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ä.

tsuriga [08.12.2009 11:15:40]

#

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ä.

Cartter [08.12.2009 16:10:14]

#

Kiitos tsuriga.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta