Tulajdonságok írása mágiával az OOP-ban PHP-ben

A __set mágikus metódus akkor hívódik meg, amikor egy nem létező vagy rejtett tulajdonság értékének módosítására tesznek kísérletet. Paraméterként átveszi a tulajdonság nevét és az értéket, amit hozzá próbálnak rendelni.

Nézzünk egy gyakorlati példát. Tegyük fel, hogy adott a következő Test osztály:

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

Készítsük el ebben az osztályban a __set mágikus metódust, amely a var_dump függvény segítségével kiírja a tulajdonság nevét, amelyhez hozzáférés történt, és az értéket, amit a tulajdonsághoz próbáltak beállítani:

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

Vizsgáljuk meg az osztályunk működését:

index.php<?php
  $test = new Test;
  $test->prop = 'érték'; // a __set metódus var_dump-ja kiírja 'prop érték'
?>

Most pedig állítsuk be az értéket annak a tulajdonságnak, amelynek neve a $property változóban tárolódik:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value; // beállítjuk az értéket
    }
  }
?>

Mostantól képesek leszünk írni a privát tulajdonságokba az osztályon kívülről:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // írjuk be az 1-et
  $test->prop2 = 2; // írjuk be a 2-t
?>

Írni tudunk, azonban azt, hogy valóban beírtunk-e oda valamit, nem tudjuk ellenőrizni, mivel a tulajdonságok privátak.

Készíthetünk getter metódust ezekhez a tulajdonságokhoz, vagy egyszerűen használhatjuk a __get mágikus metódust. Használjuk a második lehetőséget:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value;
    }
    
    // Mágikus getter tulajdonságokhoz:
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

Most már ellenőrizhetjük az osztályunk működését. Ellenőrizzük:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // írjuk be az 1-et
  $test->prop2 = 2; // írjuk be a 2-t
  
  echo $test->prop1; // kiírja 1-et
  echo $test->prop2; // kiírja 2-t
?>

Valójában természetesen nem szabad mindenki számára engedélyezni a privát tulajdonságokba való írást, különben elveszik ezeknek a privát tulajdonságoknak a lényege (egyszerűbb volna nyilvánossá tenni őket és kész).

Ezért ezt a metódust csak akkor érdemes alkalmazni, amikor erre valóban szükség van. A következő leckékben további példákat is megvizsgálunk a sikeres alkalmazásra.