Egenskabsskrivning gennem magi i OOP i PHP
Den magiske metode __set kaldes
når der forsøges at ændre værdien af en ikke-eksisterende
eller skjult egenskab. Den tager egenskabens navn og værdien, som
der forsøges at tildele den, som parametre.
Lad os se på et praktisk eksempel.
Antag, at vi har følgende klasse Test:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
Lad os lave den magiske metode
__set i denne klasse, som ved hjælp af funktionen
var_dump vil udskrive navnet på den egenskab,
der blev tilgået, og den værdi,
som der forsøges at indstille for den:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Lad os teste vores klasse:
<?php
$test = new Test;
$test->prop = 'value'; // var_dump fra __set metoden vil udskrive 'prop value'
?>
Lad os nu indstille værdien for
den egenskab, hvis navn er gemt i variablen
$property:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // indstiller værdien
}
}
?>
Nu kan vi tildele værdier til de private egenskaber udefra klassen:
<?php
$test = new Test;
$test->prop1 = 1; // tilskriver 1
$test->prop2 = 2; // tilskriver 2
?>
Vi kan tildele værdier, men vi kan ikke kontrollere, om der er blevet skrevet noget dertil, da egenskaberne er private.
Man kan lave en getter for disse egenskaber eller
bruge den magiske metode
__get. Lad os bruge den anden mulighed:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// Magisk getter for egenskaber:
public function __get($property)
{
return $this->$property;
}
}
?>
Nu kan vi teste vores klasse. Lad os teste:
<?php
$test = new Test;
$test->prop1 = 1; // tilskriver 1
$test->prop2 = 2; // tilskriver 2
echo $test->prop1; // udskriver 1
echo $test->prop2; // udskriver 2
?>
Selvfølgelig bør man ikke tillade alle og enhver at skrive til private egenskaber, ellers forsvinder meningen med disse private egenskaber (det er nemmere at gøre dem offentlige).
Derfor bør denne metode kun anvendes, når der virkelig er behov for det. I de følgende lektioner vil vi se på flere eksempler på vellykket anvendelse.