PHP-dä OOP-dä diňe okalýan aýratynlyklar

Içindäki ähli aýratynlyklary hususy bolan bir klas göräýli:

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

Indi bu aýratynlyklary daşary dünýäde diňe okap bolýan ýagdaýa getireýäli. Öňler biz muny her bir aýratynlyk üçin getter döredip, setter döredilmeýän ýagdaýda edýärdik.

Bu meseläni çözmek üçin indi sehrli usul __get-dan peýdalanyň. Onda talap edilen aýratynlygyň bahasyny gaýtaryp bereris. Buny nädip etmeli: talap edilen aýratynlygyň ady __get usulynyň parametrine düşýär, bizim ýagdaýymyzda $property.

Bu diýýän, biz içinde üýtgeýjide saklanylýan aýratynlygyň ady bolan aýratynlygy şuňa meňzeş okap bileris: $this->$property (aýratynlygyň ady üýtgeýji bolup, ýagny başynda dollaryň bolýandygyny, biz bu öwrenileni öňki sapaklarda geçdik).

Görlüşi şuňa meňzeş bolan __get usulyny dörediň:

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

Aýratynlyklary okamak üçin ony ulanyň:

index.php<?php
  $test = new Test;
  
  echo $test->prop1; // 1-ni çykarar
  echo $test->prop2; // 2-ni çykarar
?>

Aýratynlyga bir zat ýazmaga synanyşmak ýalňyşlyga sebep bolýar:

php<?php
  $test = new Test;
  $test->prop1 = 2; // ýalňyşlyk berer
?>

Bu bize gerek zat: aýratynlygy okap bolýar, ýöne ýazyp bolmaýar.

Ýöne ýok aýratynlygy okamaga synanyşmak ýalňyşlyk berer:

php<?php
  $test = new Test;
  echo $test->prop3; // ýalňyşlyk berer
?>

Şu näsagy hem üns beriň: biz diňe okalýan aýratynlyklary köne usul bilen edende, aýratynlygy okamak üçin, biz getter-usulyny ulandy.

Täze usulda biz aýratynlyklara dogrudan-da olar umumy bolan ýaly ýüzlenýäris. Ýöne olaryň içine ýazyp bilmeýäris, olar hususy bolan ýaly.

Задание 1

User klasy berlen bolsun, onuň aýratynlyklary getterler arkaly diňe okap bolýan ýagdaýda:

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

Bu klassyň kodyny şeýle bir ýagdaýa üýtgediň, getterler ýerine sehrli usul __get ulanylsyn.