Tikai lasāmas īpašības OOP PHP
Apskatīsim klasi, kurā visas īpašības ir privātas:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Tagad padarīsim šīs īpašības ārējā pasaulē pieejamas tikai lasīšanai. Iepriekš mēs jau esam to darījuši, veidojot getter metodes katrai īpašībai un neveidojot setter metodes.
Tagad, lai atrisinātu šo uzdevumu, izmantosim
māģisko metodi __get. Tajā atgriezīsim
pieprasītās īpašības vērtību. Kā
to izdarīt: pieprasītās īpašības nosaukums nonāk
metodes parametrā __get, mūsu gadījumā
$property.
Tas nozīmē, ka mēs varam nolasīt īpašību,
kuras nosaukums glabājas mainīgajā, šādi:
$this->$property (īpašības nosaukums būs
mainīgais, tas ir ar dolāra zīmi sākumā, mēs
to esam apguvuši iepriekšējās nodarbībās).
Izveidosim aprakstīto metodi __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Izmantosim to īpašību lasīšanai:
<?php
$test = new Test;
echo $test->prop1; // izvadīs 1
echo $test->prop2; // izvadīs 2
?>
Mēģinājums kaut ko ierakstīt īpašībā novedīs pie kļūdas:
<?php
$test = new Test;
$test->prop1 = 2; // izvadīs kļūdu
?>
Tas ir tieši tas, kas mums vajadzīgs: īpašību var nolasīt, bet nevar ierakstīt.
Mēģinājums nolasīt neesošu īpašību izvadīs kļūdu:
<?php
$test = new Test;
echo $test->prop3; // izvadīs kļūdu
?>
Ievērojiet arī šādu niansi: kad mēs veidojām īpašības tikai lasīšanai vecajā veidā, tad, lai nolasītu īpašību, mēs izmantojām getter metodi.
Jaunajā veidā mēs piekļūsim tieši īpašībām, it kā tās būtu publiskas. Bet ierakstīt tās nevarēsim, it kā tās būtu privātas.
Ir dota šāda klase User, kuras īpašības
ir pieejamas tikai lasīšanai, izmantojot
getter metodes:
<?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;
}
}
?>
Pārveidojiet šīs klases kodu tā, lai getter metodu vietā
izmantotos māģiskā
metode __get.