Vain luku -ominaisuudet OOP:ssa PHP:ssä

Tarkastellaan luokkaa, jossa kaikki ominaisuudet ovat yksityisiä:

Test.php<?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:

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

Käytetään sitä ominaisuuksien lukemiseen:

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

Yritys kirjoittaa jotain ominaisuuteen johtaa virheeseen:

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

Задание 1

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

php<?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.