Proprietăți doar pentru citire în OOP în PHP
Să analizăm o clasă în care toate proprietățile sunt private:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Acum să facem astfel încât aceste proprietăți în lumea exterioară să fie accesibile doar pentru citire. Am făcut deja acest lucru anterior, creând getteri pentru fiecare proprietate și necreând setteri.
Acum să folosim pentru rezolvarea acestei probleme
metoda magică __get. Vom returna
în ea valoarea proprietății solicitate. Cum
să facem acest lucru: numele proprietății solicitate ajunge
în parametrul metodei __get, în cazul nostru
$property.
Aceasta înseamnă că putem citi proprietatea,
al cărei nume este stocat în variabilă, astfel:
$this->$property (numele proprietății va fi
variabilă, adică cu dolar la început, noi
am studiat acest lucru în lecțiile anterioare).
Să creăm metoda descrisă __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Să o folosim pentru citirea proprietăților:
<?php
$test = new Test;
echo $test->prop1; // va afișa 1
echo $test->prop2; // va afișa 2
?>
Încercarea de a scrie ceva în proprietate va duce la eroare:
<?php
$test = new Test;
$test->prop1 = 2; // va da eroare
?>
Acesta este exact ceea ce avem nevoie: proprietatea poate fi citită, dar nu poate fi scrisă.
Încercarea de a citi o proprietate inexistentă va da eroare:
<?php
$test = new Test;
echo $test->prop3; // va da eroare
?>
Atenție și la următoarea nuanță: când făceam proprietățile doar pentru citire prin metoda veche, pentru a citi proprietatea, foloseam o metodă-getter.
În metoda nouă vom accesa direct proprietățile, ca și cum ar fi publice. Dar nu vom putea scrie în ele, ca și cum ar fi private.
Să presupunem că avem următoarea clasă User, ale cărei proprietăți
sunt accesibile doar pentru citire cu ajutorul
getterilor:
<?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;
}
}
?>
Refaceți codul acestei clase astfel încât în loc
de getteri să fie folosită metoda magică
__get.