Skrivebeskyttede egenskaper i OOP i PHP

La oss se på en klasse hvor alle egenskapene er private:

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

La oss nå gjøre slik at disse egenskapene i den eksterne verden kun er tilgjengelige for lesing. Tidligere har vi gjort dette ved å lage gettere for hver egenskap og ikke lage settere.

La oss nå bruke den magiske metoden __get for å løse denne oppgaven. Vi skal returnere verdien til den etterspurte egenskapen i den. Hvordan gjøre dette: navnet på den etterspurte egenskapen havner i parameteren til metoden __get, i vårt tilfelle $property.

Dette betyr at vi kan lese egenskapen, hvis navn er lagret i variabelen, slik: $this->$property (egenskapsnavnet vil være en variabel, det vil si med dollar-tegn foran, dette har vi gått gjennom i tidligere leksjoner).

La oss lage den beskrevne metoden __get:

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

La oss bruke den til å lese egenskaper:

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

Et forsøk på å skrive noe til egenskapen vil føre til en feil:

php<?php
  $test = new Test;
  $test->prop1 = 2; // vil gi en feil
?>

Dette er akkurat det vi trenger: egenskapen kan leses, men ikke skrives til.

Et forsøk på å lese en ikke-eksisterende egenskap vil gi en feil:

php<?php
  $test = new Test;
  echo $test->prop3; // vil gi en feil
?>

Vær også oppmerksom på følgende nyans: da vi lagde skrivebeskyttede egenskaper på den gamle måten, brukte vi en getter-metode for å lese egenskapen.

I den nye metoden vil vi henvise direkte til egenskapene, som om de var offentlige. Men vi vil ikke kunne skrive til dem, som om de var private.

Задание 1

Anta at vi har følgende klasse User, hvis egenskaper kun er tilgjengelige for lesing ved hjelp av gettere:

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

Omgjør koden til denne klassen slik at den magiske metoden __get brukes i stedet for gettere.