⊗ppOpMgROP 89 of 107 menu

Vain luku -ominaisuudet OOP:ssa PHP:ssä

Tarkastellaan luokkaa, jossa kaikki ominaisuudet ovat yksityisiä:

<?php class Test { private $prop1 = 1; private $prop2 = 2; } ?>

Tehdään nyt niin, että nämä ominaisuudet ulkoisessa maailmassa ovat saatavilla vain luku -oikeudella. Olemme aiemmin tehneet saman luomalla getterit jokaiselle ominaisuudelle ja jättämällä luomatta setterit.

Ratkaistaan nyt tämä tehtävä käyttämällä maagista metodia __get. Palautamme siinä pyydetyn ominaisuuden arvon. Kuinka se tehdään: pyydetyn ominaisuuden nimi päätyy metodin parametriin __get, meidän tapauksessamme $property.

Tämä tarkoittaa, että voimme lukea ominaisuuden, jonka nimi tallennetaan muuttujaan, näin: $this->$property (ominaisuuden nimi on muuttuja, eli dollarimerkki alussa, olemme käyneet tämän läpi aikaisemmissa oppitunneissa).

Tehdään kuvattu metodi __get:

<?php class Test { private $prop1 = 1; private $prop2 = 2; public function __get($property) { return $this->$property; } } ?>

Käytetään sitä ominaisuuksien lukemiseen:

<?php $test = new Test; echo $test->prop1; // tulostaa 1 echo $test->prop2; // tulostaa 2 ?>

Yritys kirjoittaa jotain ominaisuuteen johtaa virheeseen:

<?php $test = new Test; $test->prop1 = 2; // antaa virheen ?>

Tämä on juuri se, mitä tarvitsemme: ominaisuuden voi lukea, mutta siihen ei voi kirjoittaa.

Yritys lukea olematonta ominaisuutta antaa virheen:

<?php $test = new Test; echo $test->prop3; // antaa virheen ?>

Huomaa myös seuraa vivahde: kun teimme ominaisuuksista vain luku -oikeudella vanhalla tavalla, niin ominaisuuden lukemiseksi käytimme getter-metodia.

Uudessa tavassa käytämme ominaisuuksiin pääsyyn suoraan, ikään kuin ne olisivat julkisia. Mutta kirjoittaa niihin emme pysty, ikään kuin ne olisivat yksityisiä.

Olkoon annettu tällainen luokka User, jonka ominaisuudet ovat saatavilla vain luku -oikeudella käyttämällä gettereitä:

<?php class User { private $name; private $age; public function __construct($name, $age) { $this->name = $name; $this->age = $age; } public function getName() { return $this->name; } public function getAge() { return $this->age; } } ?>

Muokkaa tämän luokan koodia niin, että getterien sijasta käytetään maagista metodia __get.

Suomi
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Käytämme evästeitä verkkosivuston toiminnalle, analytiikalle ja personoinnille. Tietojen käsittely tapahtuu Tietosuojakäytännön mukaisesti.
hyväksy kaikki mukauta hylkää