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:
<?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:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
La oss teste klassen vår:
<?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:
<?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:
<?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:
<?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:
<?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.