Eienskappe slegs vir lees in OOP in PHP
Kom ons kyk na 'n klas waarin alle eienskappe privaat is:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Laat ons nou maak dat hierdie eienskappe in die eksterne wêreld slegs leesbaar is. Ons het dit vroeër reeds gedoen deur getters vir elke eienskap te skep sonder om setters te skep.
Kom ons gebruik nou die magiese metode
__get om hierdie probleem op te los. Ons sal
die waarde van die versoekte eienskap daarin
teruggee. Hoe
om dit te doen: die naam van die versoekte eienskap beland
in die parameter van die metode __get, in ons geval
$property.
Dit beteken dat ons die eienskap kan lees
waarvan die naam in die veranderlike gestoor is, soos volg:
$this->$property (die naam van die eienskap sal
'n veranderlike wees, dit wil sê met 'n dollarteken aan die begin, ons
het dit in vorige lesse behandel).
Kom ons maak die beskryfde metode __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Kom ons gebruik dit om eienskappe te lees:
<?php
$test = new Test;
echo $test->prop1; // sal 1 uitvoer
echo $test->prop2; // sal 2 uitvoer
?>
'n Poging om iets in die eienskap te skryf sal lei tot 'n fout:
<?php
$test = new Test;
$test->prop1 = 2; // sal 'n fout gee
?>
Dit is presies wat ons nodig het: die eienskap kan gelees word, maar nie geskryf word nie.
'n Poging om 'n nie-bestaande eienskap te lees sal 'n fout gee:
<?php
$test = new Test;
echo $test->prop3; // sal 'n fout gee
?>
Let ook op die volgende fyn punt: toe ons eienskappe slegs leesbaar gemaak het op die ou manier, het ons 'n getter-metode gebruik om die eienskap te lees.
In die nuwe manier sal ons direk na eienskappe verwys, asof hulle publiek is. Maar ons sal nie daarin kan skryf nie, asof hulle privaat is.
Gestel daar is 'n klas User waarvan die eienskappe
slegs leesbaar is met behulp van
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;
}
}
?>
Herskep die kode van hierdie klas sodat in plaas van
getters, die magiese
metode __get gebruik word.