Eienskappe slegs vir lees in OOP in PHP

Kom ons kyk na 'n klas waarin alle eienskappe privaat is:

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

Laat ons nou maak dat hierdie eienskappe in die eksterne wêreld slegs leesbaar is. Ons het dit vroeër reeds gedoen deur getters vir elke eienskap te skep sonder om setters te skep.

Kom ons gebruik nou die magiese metode __get om hierdie probleem op te los. Ons sal die waarde van die versoekte eienskap daarin teruggee. Hoe om dit te doen: die naam van die versoekte eienskap beland in die parameter van die metode __get, in ons geval $property.

Dit beteken dat ons die eienskap kan lees waarvan die naam in die veranderlike gestoor is, soos volg: $this->$property (die naam van die eienskap sal 'n veranderlike wees, dit wil sê met 'n dollarteken aan die begin, ons het dit in vorige lesse behandel).

Kom ons maak die beskryfde metode __get:

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

Kom ons gebruik dit om eienskappe te lees:

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

'n Poging om iets in die eienskap te skryf sal lei tot 'n fout:

php<?php
  $test = new Test;
  $test->prop1 = 2; // sal 'n fout gee
?>

Dit is presies wat ons nodig het: die eienskap kan gelees word, maar nie geskryf word nie.

'n Poging om 'n nie-bestaande eienskap te lees sal 'n fout gee:

php<?php
  $test = new Test;
  echo $test->prop3; // sal 'n fout gee
?>

Let ook op die volgende fyn punt: toe ons eienskappe slegs leesbaar gemaak het op die ou manier, het ons 'n getter-metode gebruik om die eienskap te lees.

In die nuwe manier sal ons direk na eienskappe verwys, asof hulle publiek is. Maar ons sal nie daarin kan skryf nie, asof hulle privaat is.

Задание 1

Gestel daar is 'n klas User waarvan die eienskappe slegs leesbaar is met behulp van getters:

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

Herskep die kode van hierdie klas sodat in plaas van getters, die magiese metode __get gebruik word.