Kirjutamatuad omadused OOP-s PHP-s

Vaatleme klassi, kus kõik omadused on privaatsed:

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

Teeme nüüd nii, et need omadused oleksid välises maailmas saadaval ainult lugemiseks. Oleme seda varem teinud, luues iga omaduse jaoks getterid ja mitte luues settereid.

Kasutame nüüd selle ülesande lahendamiseks magilist meetodit __get. Tagastame selles päritud omaduse väärtuse. Kuidas seda teha: päritud omaduse nimi satub meetodi __get parameetrisse, meie puhul $property.

See tähendab, et me saame lugeda omadust, mille nimi on salvestatud muutujasse, nii: $this->$property (omaduse nimi on muutuv, see tähendab dollarmärgiga alguses, me oleme seda õppinud eelmistes õppetundides).

Teeme kirjeldatud meetodi __get:

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

Kasutame seda omaduste lugemiseks:

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

Katse midagi omadusse kirjutada viib veani:

php<?php
  $test = new Test;
  $test->prop1 = 2; // annab vea
?>

See on täpselt see, mida me vajame: omadust saab lugeda, kuid sinna ei saa kirjutada.

Katse lugeda olematut omadust annab vea:

php<?php
  $test = new Test;
  echo $test->prop3; // annab vea
?>

Pange tähele ka järgmist nüanssi: kui me tegime omadused kirjutamatuteks vanal viisil, siis omaduse lugemiseks kasutasime meetodit-getterit.

Uues viisis me pöördume otse omaduste poole, justkui need oleksid avalikud. Kuid sinna kirjutada ei saa, justkui need oleksid privaatsed.

Задание 1

Olgu antud järgmine klass User, mille omadused on saadaval ainult lugemiseks kasutades gettereid:

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;
    }
  }
?>

Teisendage selle klassi kood nii, et getterite asemel kasutatakse magilist meetodit __get.