Skrivebeskyttede egenskaper i OOP i PHP
La oss se på en klasse hvor alle egenskapene er private:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
La oss nå gjøre slik at disse egenskapene i den eksterne verden kun er tilgjengelige for lesing. Tidligere har vi gjort dette ved å lage gettere for hver egenskap og ikke lage settere.
La oss nå bruke den magiske metoden
__get for å løse denne oppgaven. Vi skal returnere
verdien til den etterspurte egenskapen i den.
Hvordan
gjøre dette: navnet på den etterspurte egenskapen havner
i parameteren til metoden __get, i vårt tilfelle
$property.
Dette betyr at vi kan lese egenskapen,
hvis navn er lagret i variabelen, slik:
$this->$property (egenskapsnavnet vil være
en variabel, det vil si med dollar-tegn foran, dette
har vi gått gjennom i tidligere leksjoner).
La oss lage den beskrevne metoden __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
La oss bruke den til å lese egenskaper:
<?php
$test = new Test;
echo $test->prop1; // vil skrive ut 1
echo $test->prop2; // vil skrive ut 2
?>
Et forsøk på å skrive noe til egenskapen vil føre til en feil:
<?php
$test = new Test;
$test->prop1 = 2; // vil gi en feil
?>
Dette er akkurat det vi trenger: egenskapen kan leses, men ikke skrives til.
Et forsøk på å lese en ikke-eksisterende egenskap vil gi en feil:
<?php
$test = new Test;
echo $test->prop3; // vil gi en feil
?>
Vær også oppmerksom på følgende nyans: da vi lagde skrivebeskyttede egenskaper på den gamle måten, brukte vi en getter-metode for å lese egenskapen.
I den nye metoden vil vi henvise direkte til egenskapene, som om de var offentlige. Men vi vil ikke kunne skrive til dem, som om de var private.
Anta at vi har følgende klasse User, hvis egenskaper
kun er tilgjengelige for lesing ved hjelp av
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;
}
}
?>
Omgjør koden til denne klassen slik at den magiske
metoden __get brukes i stedet for
gettere.