PHP да ООПда хоссаларни ёзишда сеҳр

Магик метод __set чақирилади мавжуд бўлмаган ёки беркитилган хоссанинг қийматини ўзгартиришга уринилганда. У параметр сифатида хосса номи ва унга белгиланмоқчи бўлган қийматни қабул қилади.

Келинг, амалий мисолда кўрамиз. Айтайлик бизда Test деган класс бор:

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

Келинг, бу классда магик метод __set ни яратайлик, унинг ёрдамида var_dump функцияси хосса номини, унга мурожаат қилинганлигини ва қийматни, у хоссага қўйилмоқчи бўлганлигини чиқариб берсин:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      var_dump($property . ' ' .$value);
    }
  }
?>

Классимизнинг ишлашини текширамиз:

index.php<?php
  $test = new Test;
  $test->prop = 'value'; // __set методанинг var_dump и 'prop value' ни чиқаради
?>

Энди эса номи $property ўзгарувчисида сақланаётган хоссага қиймат белгилаймиз:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value; // қийматни белгилаймиз
    }
  }
?>

Энди биз хусусий хоссаларга класс ташқарисидан ёза оламиз:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // 1 ни ёзамиз
  $test->prop2 = 2; // 2 ни ёзамиз
?>

Биз ёза оламиз, аммо, унга бирон нарса ёзилдими ёки йўқмилигини текширолмаймиз, чунки хоссалар хусусий.

Бу хоссалар учун геттер яратиш мумкин ёки магик метод __get дан фойдаланиш мумкин. Иккинчи вариантдан фойдаланамиз:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value;
    }
    
    // Хоссалар учун магик геттер:
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

Энди биз классимизнинг ишлашини текшира оламиз. Текширамиз:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // 1 ни ёзамиз
  $test->prop2 = 2; // 2 ни ёзамиз
  
  echo $test->prop1; // 1 ни чиқаради
  echo $test->prop2; // 2 ни чиқаради
?>

Албатта, хар кимга хусусий хоссаларга ёзишга рухсат бериш керак эмас, акс ҳолда у хусусий хоссаларнинг мақсади йўқолади (уларни оммавий қилиб қўйиш осонроқ).

Шу сабабли бу метод фақат ҳақиқатдан зарурат бўлгандагина қўлланилиши керак. Кейинги дарсларда биз яна муваффақиятли қўллаш мисолларини кўриб чиқамиз.