Propiedades de solo lectura en POO en PHP

Consideremos una clase en la que todas las propiedades son privadas:

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

Ahora hagamos que estas propiedades en el mundo exterior sean accesibles solo para lectura. Anteriormente ya hicimos esto, creando getters para cada propiedad y sin crear setters.

Ahora resolvamos esta tarea utilizando el método mágico __get. Devolveremos en él el valor de la propiedad solicitada. Cómo hacerlo: el nombre de la propiedad solicitada llega al parámetro del método __get, en nuestro caso $property.

Esto significa que podemos leer la propiedad, cuyo nombre está almacenado en una variable, así: $this->$property (el nombre de la propiedad será una variable, es decir, con un dólar al principio, esto lo estudiamos en lecciones anteriores).

Hagamos el método __get descrito:

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

Utilicémoslo para leer las propiedades:

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

El intento de escribir algo en la propiedad llevará a un error:

php<?php
  $test = new Test;
  $test->prop1 = 2; // dará un error
?>

Esto es exactamente lo que necesitamos: la propiedad se puede leer, pero no se puede escribir.

El intento de leer una propiedad inexistente dará un error:

php<?php
  $test = new Test;
  echo $test->prop3; // dará un error
?>

También presten atención al siguiente matiz: cuando hacíamos propiedades de solo lectura de la manera antigua, para leer la propiedad, usábamos un método getter.

En la nueva forma, nos dirigiremos precisamente a las propiedades, como si fueran públicas. Pero no podremos escribir en ellas, como si fueran privadas.

Задание 1

Supongamos que se da la siguiente clase User, cuyas propiedades son accesibles solo para lectura mediante 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;
    }
  }
?>

Rehagan el código de esta clase para que en lugar de getters se use el método mágico __get.