$this-> merkitys ja luokat

ggfgdghjgkiiouliuoui

Hei. Olen yrittänyt kirjan avulla yrittänyt oppia PHP:ta ja kirja ei selitä, enkä googlella löydä enkä itse ymmärrä, mitä $this-> merkitsee. Tämä on siis tullut vastaan luokkia opetellessa.

Toinen asia joka luokissa menee oman ymmärryksen yli on kirjan esimerkkien alkufunktiot. Kirjasta otettu pieni esimerkki:

class Piste
{
var $x;
var $y;
function Piste()
{
$this->x = 0;
$this->y = 0;
}

Sen ymmärrän, että kun muuttuja kutsuu/avaa luokan eli $m1 = new Piste(); niin se ajaa tuon funktion jolloin muuttujan $x ja $y arvo on 0. Mutta miksi tuo Piste() funktio pitää olla? Miksi ei voisi olla var $x = 0;?

Kiitos etukäteen vastaajille!

7

419

    Vastaukset 7

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • sdfsfsdfsdf24234

      Tuota systeemiä kutsustaan "Constructoriksi" joka siis kutsutaan aina luokkaa luodessa.

      Tuo systeemi on tuollainen koska constructori voi sisältää paljon monimutkaisempaa matematiikkaa ja koodia riippuen tietysti millaista dataa alustellaan.

      Tietysti tuo esimerkki on vain hyvin yksinkertainen luokka ja todellisuudessat tuollaiseen ei luokkaa edes kannattaisi käyttää.

    • Joku Vaan

      Niin toi on jostain vanhasta oppaasta, nykyään käytetään PHP 5... jossa olioiden käsittelyyn tuli paljon parannuksia. Sekä var sana poistuu myös.

      http://www.php.net/manual/en/language.oop5.decon.php


      Tässä sulle pieni koodi joka toivottavasti vastaa kysymyksiisi.vaikka se tällä foorumilla aika sekavaksi muuttuu sisennysten jne... takia.

      class Piste {
      // private koska halutaan estää ettei muuttujiin päästä käsiksi luokan ulkopuolelta
      // Näin voidaan olla varmoja mitä muuttuja sisältää. nimessä _ siksi koska helppo erottaa public.
      // http://www.php.net/manual/en/language.oop5.visibility.php

      /* @var int $_x */
      private $_x = null;

      /* @var int $_y */
      public $y = null;


      /**
      * @param int $x oletus 1
      */
      public function __construct($x = 1)
      {
      $this->aseta_x($x * 4);
      }


      /**
      * Tarkistaa onko kokonaisluku, ellei niin heittää poikkeuksen
      * @param int $luku
      * @return int $luku
      */
      private function _kokonaisluvun_tarkistus($luku)
      {
      if (!is_int($luku))
      {
      throw new Exception($luku . ' ei ole kokonaisluku');
      }

      return $luku;
      }


      /**
      * Asettaa x
      * @param int $x
      * @return $this
      */
      public function aseta_x($x)
      {
      // tämä muuttuja on käytossä koko luokassa.
      $this->_x = $this->_kokonaisluvun_tarkistus($x);

      // Palauttaa olion itsessään
      return $this;
      }


      /**
      * Asettaa y
      * @param int $y
      * @return $this
      */
      public function aseta_y($y)
      {
      // tämä muuttuja on käytossä vain tämän metodin(function) sisällä.
      $y = $this->_kokonaisluvun_tarkistus($y);

      return $this;
      }
      }


      echo '';


      try
      {
      $testi = new Piste();

      echo " Constructorin asettama (_x) \n";
      var_dump($testi);

      echo "\n\n Aseta metodien laittamat, huomaa y (this puute) \n";
      $testi->aseta_x(7777)->aseta_y(8888);
      var_dump($testi);

      echo "\n\n Epäkelpo arvo (public y) \n";
      $testi->y = 'Epäkelpo';
      // $testi->_x = 'Epäkelpo'; //Fatal error: Cannot access private property
      var_dump($testi);

      echo "\n\n Testataan poikkeuksen toimivuus (private _x) \n";
      $testi->aseta_x('epäkelpo');
      }
      catch (Exception $e)
      {
      echo 'poikkeus toimii, mitäs tehtäis? tulostetaan vaik alkuperäinen virheilmoitus jota ei yleensä kannata kävijöille näyttää: ' . $e->getMessage();
      //var_dump($testi);
      }

      Toi on sitten vain esimerkki, joten täydellinen se ei todellakaan ole, vaikka toimiikin.

    • Joku Vaan

      Tjaahas tälläkertaa Suomi24 oli nälkä kun söi vaikka mitä merkkejä. Uusi yritys, osaat varmaankin muuttaa | merkit kommentti lohkoiks joskos siitä ongelma aiheutuisi. Onkos täällä missään opasta tyhmälle miten lähetetään viesti ilman merkkien syömistä?

      class Piste {
      | private koska halutaan estää ettei muuttujiin päästä käsiksi luokan ulkopuolelta
      | Näin voidaan olla varmoja mitä muuttuja sisältää. nimessä _ siksi koska helppo erottaa public.
      | http://www.php.net/manual/en/language.oop5.visibility.php

      | @var int $_x
      private $_x = null;

      | @var int $_y
      public $y = null;


      |
      | @param int $x oletus 1
      |
      public function __construct($x = 1)
      {
      $this->aseta_x($x * 4);
      }


      |
      | Tarkistaa onko kokonaisluku, ellei niin heittää poikkeuksen
      | @param int $luku
      | @return int $luku
      |
      private function _kokonaisluvun_tarkistus($luku)
      {
      if (!is_int($luku))
      {
      throw new Exception($luku . ' ei ole kokonaisluku');
      }

      return $luku;
      }


      |
      | Asettaa x
      | @param int $x
      | @return $this
      |
      public function aseta_x($x)
      {
      | tämä muuttuja on käytossä koko luokassa.
      $this->_x = $this->_kokonaisluvun_tarkistus($x);

      | Palauttaa olion itsessään
      return $this;
      }


      |
      | Asettaa y
      | @param int $y
      | @return $this
      |
      public function aseta_y($y)
      {
      | tämä muuttuja on käytossä vain tämän metodin(function) sisällä.
      $y = $this->_kokonaisluvun_tarkistus($y);

      return $this;
      }
      }


      echo '';


      try
      {
      $testi = new Piste();

      echo " Constructorin asettama (_x) \n";
      var_dump($testi);

      echo "\n\n Aseta metodien laittamat, huomaa y (this puute) \n";
      $testi->aseta_x(7777)->aseta_y(8888);
      var_dump($testi);

      echo "\n\n Epäkelpo arvo (public y) \n";
      $testi->y = 'Epäkelpo';
      | $testi->_x = 'Epäkelpo'; Fatal error: Cannot access private property
      var_dump($testi);

      echo "\n\n Testataan poikkeuksen toimivuus (private _x) \n";
      $testi->aseta_x('epäkelpo');
      }
      catch (Exception $e)
      {
      echo 'poikkeus toimii, mitäs tehtäis? tulostetaan vaik alkuperäinen virheilmoitus jota ei yleensä kannata kävijöille näyttää: ' . $e->getMessage();
      |var_dump($testi);
      }

    • ggfgdghjgkiiouliuoui

      Näköjään aika paljonkin eroavaisuuksia php4 ja 5 välillä. Tuo esimerkki ei nyt ihan kokonaan auennut mulle mutta kyllä siitä apua oli. Melkein suosiolla taidan tuon kirjan luokkakohdat jättää väliin ja opetella ne jostain muualta.

    • Joku Vaan

      Hyvä että oli apua, vaikka esimerkistä puutuu vieläkin paljon merkkejä, on se kumma kun foorumi niitä syö vaikka toisissa viesteissä samat merkit näkyvätkin.

      Jos kirja on niin vanha, että se käsittelee PHP4:n olioita, niin omasta mielestäni olisi parempa opetella oliot jostain uudemmasta jossa on käytetty PHP5:den ominaisuuksia, ja sitten myöhemmin vasta PHP4:n tapa jos kiinostusta on. Näin et alitajuisesti käyttäisi huonoja ratkaisuja.

      Kannattaa myös huomioida, että jotkin ensinmäiset PHP5 käsittelevät kirjat olivatkin olioiden osalta lähes PHP4 lisättynä vain muutama näkyvyys määre.

      Varmaan tiesitkin, että PHP 4 ei enään edes päivitetä, joten lähes jokaisella palvelimella on jo jokin PHP 5.x versio käytössä. Kun opettelet vanhan kirjan mukaan niin kannattaa lukasta http://php.net/manual/en/migration53.deprecated.php ja laittaa testi palvelimella http://fi2.php.net/manual/en/function.error-reporting.php niin että tulee ilmoitus jos niitä käyttää.

    • 234242424

      Suosittelen käyttämään koodi pasteihin vaikkapa http://ideone.com

      Olis tosiaan korkea aika että suomi24 saataisiin kunnon code tagit.

    • Joku Vaan

      Kokeillaan joskos koodi olisi tuolla hieman selvempi http://ideone.com/IyWcl

      Eihän kooditagien tarvitsisi olla mitenkään monimutkaset kieli kohtasine värityksineen jne... vaan ihan pre tagin sisälle koodi riittäisi.

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. kolme tunnistetta kaivatustasi

      Anna kolme tunnistetta kaivatussasi!
      Ikävä
      79
      1511
    2. Kai mua vähän

      Masentaa tämä kaikki. Tämä koko meidän välinen juttu on niin vaikea… Voitaisiinko molemmat lopettaa tilanteen ruokkimine
      Ikävä
      139
      1183
    3. Onko karhukanta jo liian iso? Lenkkeilijä kohtasi kontion juoksulenkillä

      Rantasalmella lenkkeilijä kohtasi karhun. Kylällä karhun näkeminen on ollut tosi harvinaista. Onko karhukanta jo liian i
      Maailman menoa
      119
      857
    4. Vanhat konkarit ulos Elämäni biisistä - Yle selittelee

      Elämäni biisi starttaa taas tänä syksynä. Mukana on ripaus uutta, mutta poissa on iso osa vanhaa... Poissa ovat Markku
      Tv-sarjat
      22
      759
    5. S-ryhmän Israel-boikotti liiketalouden opintojen tapausesimerkkinä

      Tätä S-ryhmän Israel-boikottitapausta käsitellään jo kauppakorkeakoulujen ja johtamiskorkeakoulujen esimerkeissä. Se ant
      Maailman menoa
      29
      709
    6. Oot upea nainen, älä vähättele ittees

      Ja tietojeni mukaan 2 muuta on susta kiinnostuneit mun lisäks. 👀
      Ikävä
      41
      698
    7. Mitä tehdä kun rakastan yhtä ja olen rakastunut toiseen

      Kamala tilanne. Voinko pitää molemmat? 😁
      Ikävä
      67
      637
    8. Mitä vit,,tua!

      Mikä hiivatin kommunistien teltta oli kirsikan nurkalla, olivat vähällä jäädä telttoinensa auton alle kun olivat sen kul
      Suomussalmi
      28
      610
    9. Hyvä Kukkola! toitte tänne taas jotain uutta

      Niin sitä pitää! Kehittää oikeasti tarjontaa. Nyt on maut kohdillaan! Käykäähän herkuttelemassa wingseillä ja siipiweikk
      Haapavesi
      69
      600
    10. Mies miksi moinen vetäytyminen?

      1) Olit loukkaantunut tai suuttunut 2) Sulla oli toinen nainen 3) Luulit, etten halua jatkaa tutustumista 4) Vai joku
      Ikävä
      52
      569
    Aihe