Att skriva egenskaper genom magi i OOP i PHP
Den magiska metoden __set anropas
när man försöker ändra värdet på en icke-existerande
eller dold egenskap. Den tar emot egenskapens namn och värdet
som man försöker tilldela den som parametrar.
Låt oss titta på ett praktiskt exempel.
Anta att vi har följande klass Test:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
Låt oss skapa den magiska metoden
__set i denna klass, som med hjälp av funktionen
var_dump kommer att skriva ut egenskapens namn,
som anropades, och värdet
som försökte sättas för denna egenskap:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Låt oss testa vår klass:
<?php
$test = new Test;
$test->prop = 'value'; // var_dump från __set-metoden kommer att skriva ut 'prop value'
?>
Låt oss nu sätta värdet
på egenskapen vars namn lagras i variabeln
$property:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // sätter värdet
}
}
?>
Nu kan vi skriva till de privata egenskaperna utifrån klassen:
<?php
$test = new Test;
$test->prop1 = 1; // sätter 1
$test->prop2 = 2; // sätter 2
?>
Vi kan skriva till dem, men vi kan inte kontrollera om något skrevs dit eller inte, eftersom egenskaperna är privata.
Man kan skapa en getter för dessa egenskaper eller
bara använda den magiska metoden
__get. Låt oss använda det andra alternativet:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// Magisk getter för egenskaper:
public function __get($property)
{
return $this->$property;
}
}
?>
Nu kan vi kontrollera hur vår klass fungerar. Låt oss testa:
<?php
$test = new Test;
$test->prop1 = 1; // sätter 1
$test->prop2 = 2; // sätter 2
echo $test->prop1; // skriver ut 1
echo $test->prop2; // skriver ut 2
?>
I verkligheten bör man förstås inte låta vem som helst skriva till privata egenskaper, annars försvinner poängen med dessa privata egenskaper (det är enklare att göra dem publika och så är det med det).
Därför bör denna metod endast användas när det verkligen finns ett behov av det. I kommande lektioner kommer vi att titta på fler exempel på lyckad användning.