Запишување на својства преку магија во ООП во 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
?>

Можеме да запишуваме, сепак, да провериме дали нешто е запишано таму - не, бидејќи својствата се приватни.

Може да се направи getter за овие својства или едноставно да се искористи магичниот метод __get. Да го искористиме вториот вариант:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value;
    }
    
    // Магичен getter за својства:
    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
?>

Всушност, се разбира, не треба да се дозволи на сите произволно да запишуваат во приватни својства, инаку целата поента на тие приватни својства се губи (полесно е да се направат јавни и толку).

Затоа овој метод треба да се применува само тогаш кога навистина постои потреба за тоа. Во следните лекции уште ќе разгледаме примери на успешна примена.