Egendefinering av egenskaper gjennom magi i OOP i PHP

Den magiske metoden __set blir kalt ved forsøk på å endre verdien til en ikke-eksisterende eller skjult egenskap. Den tar imot egenskapsnavn og verdi som parametere, som den prøver å tilordne.

La oss se på et praktisk eksempel. Anta at vi har en klasse Test som dette:

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

La oss lage en magisk metode __set i denne klassen, som ved hjelp av funksjonen var_dump skal skrive ut navnet på egenskapen det ble forsøkt å få tilgang til, og verdien som det ble forsøkt å sette for denne egenskapen:

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

La oss teste klassen vår:

index.php<?php
  $test = new Test;
  $test->prop = 'verdi'; // var_dump fra __set-metoden vil skrive ut 'prop verdi'
?>

La oss nå sette verdien for egenskapen med navn lagret i variabelen $property:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value; // setter verdien
    }
  }
?>

Nå kan vi skrive til de private egenskapene utenfor klassen:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // skriver 1
  $test->prop2 = 2; // skriver 2
?>

Vi kan skrive, men vi kan ikke sjekke om noe ble skrevet dit, siden egenskapene er private.

Man kan lage en getter for disse egenskapene eller bruke den magiske metoden __get. La oss bruke det andre alternativet:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value;
    }
    
    // Magisk getter for egenskaper:
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

Nå kan vi teste klassen vår. La oss teste:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // skriver 1
  $test->prop2 = 2; // skriver 2
  
  echo $test->prop1; // skriver ut 1
  echo $test->prop2; // skriver ut 2
?>

Selvfølgelig bør man ikke tillate hvem som helst å skrive til private egenskaper, ellers forsvinner meningen med disse private egenskapene (det er enklere å gjøre dem offentlige og være ferdig med det).

Derfor bør denne metoden bare brukes når det virkelig er nødvendig. I de neste leksjonene skal vi se på eksempler på vellykket bruk.