Skrivskyddade egenskaper i OOP i PHP
Låt oss titta på en klass där alla egenskaper är privata:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Låt oss nu göra så att dessa egenskaper i den externa världen endast är tillgängliga för läsning. Vi har gjort detta tidigare genom att skapa getters för varje egenskap och inte skapa setters.
Låt oss nu använda oss av
den magiska metoden __get för att lösa denna uppgift. Vi kommer att returnera
värdet på den efterfrågade egenskapen i den.
Hur
man gör detta: namnet på den efterfrågade egenskapen hamnar
i parametern för metoden __get, i vårt fall
$property.
Det betyder att vi kan läsa egenskapen,
vars namn lagras i en variabel, så här:
$this->$property (egenskapens namn kommer att vara
en variabel, det vill säga med ett dollartecken i början, vi
har gått igenom detta i tidigare lektioner).
Låt oss skapa den beskrivna metoden __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Låt oss använda den för att läsa egenskaper:
<?php
$test = new Test;
echo $test->prop1; // skriver ut 1
echo $test->prop2; // skriver ut 2
?>
Ett försök att skriva något till egenskapen kommer att leda till ett fel:
<?php
$test = new Test;
$test->prop1 = 2; // ger ett fel
?>
Det är precis vad vi behöver: egenskapen kan läsas, men inte skrivas.
Ett försök att läsa en egenskap som inte finns kommer att ge ett fel:
<?php
$test = new Test;
echo $test->prop3; // ger ett fel
?>
Var även uppmärksam på följande nyans: när vi gjorde egenskaper skrivskyddade på det gamla sättet, använde vi en getter-metod för att läsa egenskapen.
I det nya sättet kommer vi att hänvisa direkt till egenskaperna, som om de vore publika. Men vi kommer inte att kunna skriva till dem, som om de vore privata.
Antag att vi har följande klass User, vars egenskaper
endast är läsbara med hjälp av
getters:
<?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;
}
}
?>
Omvandla koden för denna klass så att den magiska
metoden __get används istället för
getters.