Писање својстава кроз магију у ООП у 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'; // var_dump метода __set исписаће '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
?>

У ствари, наравно, не треба дозвољавати свима да уписују у приватна својства, иначе нестаје поента тих приватних својстава (једноставније је да се направе јавним и то је то).

Зато овај метод треба примењивати само онда када за то заиста постоји потреба. У следећим лекцијама ћемо још размотрити примере успешне примене.