Skrivebeskyttede egenskaber i OOP i PHP
Lad os se på en klasse, hvor alle egenskaber er private:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Lad os nu gøre sådan, at disse egenskaber i den eksterne verden kun er tilgængelige for læsning. Tidligere har vi allerede gjort dette ved at oprette gettere for hver egenskab og ikke oprette settere.
Lad os nu bruge den magiske metode
__get til at løse denne opgave. Vi vil returnere
værdien af den anmodede egenskab i den. Hvordan
man gør dette: navnet på den anmodede egenskab kommer
i parameteren for metoden __get, i vores tilfælde
$property.
Det betyder, at vi kan læse egenskaben,
hvis navn er gemt i en variabel, sådan her:
$this->$property (navnet på egenskaben vil være
en variabel, det vil sige med dollar-tegn i starten, vi
har gennemgået dette i tidligere lektioner).
Lad os lave den beskrevne metode __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Lad os bruge den til at læse egenskaber:
<?php
$test = new Test;
echo $test->prop1; // vil udskrive 1
echo $test->prop2; // vil udskrive 2
?>
Et forsøg på at skrive noget til egenskaben vil føre til en fejl:
<?php
$test = new Test;
$test->prop1 = 2; // vil give en fejl
?>
Det er præcis, hvad vi har brug for: egenskaben kan læses, men ikke skrives til.
Et forsøg på at læse en ikke-eksisterende egenskab vil give en fejl:
<?php
$test = new Test;
echo $test->prop3; // vil give en fejl
?>
Vær også opmærksom på følgende nuance: da vi lavede skrivebeskyttede egenskaber på den gamle måde, brugte vi en getter-metode for at læse egenskaben.
I den nye metode vil vi henvise specifikt til egenskaber, som om de var offentlige. Men vi kan ikke skrive til dem, som om de var private.
Antag, at der er givet en sådan klasse User, hvis egenskaber
kun er tilgængelige for læsning ved hjælp af
gettere:
<?php
class User
{
private $name;
private $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Omdan koden for denne klasse, så den magiske
metode __get bruges i stedet for
gettere.