Կարդալու համար նախատեսված հատկությունները OOP-ում PHP-ում

Դիտարկենք դաս, որում բոլոր հատկությունները պրիվատ են:

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

Այժմ եկեք անենք, որ այս հատկությունները արտաքին աշխարհում հասանելի լինեն միայն կարդալու համար: Նախկինում մենք արդեն անում էինք նման բան, ստեղծելով գետտերներ յուրաքանչյուր հատկության համար և չստեղծելով սետտերներ:

Եկեք այժմ այս խնդիրը լուծելու համար օգտագործենք կախարդական մեթոդը __get: Մենք կվերադարձնենք դրանում հարցված հատկության արժեքը: Ինչպես անել դա՝ հարցված հատկության անունը հայտնվում է մեթոդի պարամետրում __get, մեր դեպքում $property:

Սա նշանակում է, որ մենք կարող ենք կարդալ հատկությունը, որի անունը պահվում է փոփոխականում, ահա այսպես: $this->$property (հատկության անունը կլինի փոփոխական, այսինքն՝ սկզբում դոլար նշանով, մենք սա անցել ենք նախորդ դասերում):

Եկեք ստեղծենք նկարագրված __get մեթոդը.

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

Օգտագործենք այն հատկությունները կարդալու համար.

index.php<?php
  $test = new Test;
  
  echo $test->prop1; // կարտածի 1
  echo $test->prop2; // կարտածի 2
?>

Ինչ-որ բան գրելու փորձը հատկության մեջ կհանգեցնի սխալի.

php<?php
  $test = new Test;
  $test->prop1 = 2; // կտա սխալ
?>

Սա հենց այն է, ինչ մեզ պետք է. հատկությունը կարելի է կարդալ, բայց չի կարելի գրել:

Գոյություն չունեցող հատկություն կարդալու փորձը կտա սխալ.

php<?php
  $test = new Test;
  echo $test->prop3; // կտա սխալ
?>

Ուշադրություն դարձրեք նաև հետևյալ նրբերանգին. երբ մենք հատկությունները դարձնում էինք միայն կարդալու համար հին եղանակով, ապա հատկությունը կարդալու համար մենք օգտագործում էինք մեթոդ-գետտեր:

Նոր եղանակով մենք կդիմենք հենց հատկություններին, կարծես դրանց հասարակական են: Բայց դրանց մեջ գրել չենք կարող, կարծես դրանց պրիվատ են:

Задание 1

Թող տրված լինի ահա այսպիսի User դասը, որի հատկությունները մատչելի են միայն կարդալու համար օգտագործելով գետտերներ.

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

Վերափոխեք այս դասի կոդն այնպես, որ գետտերների փոխարեն օգտագործվի կախարդական մեթոդ __get: