Vetitë Read-Only në OOP në PHP
Le të shqyrtojmë një klasë ku të gjitha vetitë janë private:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Tani le t'i bëjmë këto veti në botën e jashtme të disponueshme vetëm për lexim. Më parë kemi bërë diçka të tillë, duke krijuar getters për çdo veti dhe pa krijuar setters.
Tani le ta zgjidhim këtë problem duke përdorur
metodën magjike __get. Do të kthejmë
në të vlerën e vetisë së kërkuar. Si
të bëhet: emri i vetisë së kërkuar shkon
në parametrin e metodës __get, në rastin tonë
$property.
Kjo do të thotë se mund të lexojmë vetinë,
emri i së cilës ruhet në variabël, kështu:
$this->$property (emri i vetisë do të jetë
i ndryshueshëm, domethënë me dollar në fillim, ne
e kemi studiuar këtë në mësimet e mëparshme).
Le të krijojmë metodën e përshkruar __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Le ta përdorim atë për të lexuar vetitë:
<?php
$test = new Test;
echo $test->prop1; // do të shfaqë 1
echo $test->prop2; // do të shfaqë 2
?>
Përpjekja për të shkruar diçka në veti do të çojë në gabim:
<?php
$test = new Test;
$test->prop1 = 2; // do të japë gabim
?>
Kjo është pikërisht ajo që na nevojitet: vetia mund të lexohet, por nuk mund të shkruhet.
Përpjekja për të lexuar një veti që nuk ekziston do të japë gabim:
<?php
$test = new Test;
echo $test->prop3; // do të japë gabim
?>
Ju lutemi vini re gjithashtu një nuancë tjetër: kur ne i bëmë vetitë vetëm për lexim me metodën e vjetër, për të lexuar vetinë, ne përdorëm metodën getter.
Në metodën e re ne do të drejtohemi pikërisht te vetitë, sikur ato të jenë publike. Por nuk do të mund të shkruajmë në to, sikur ato të jenë private.
Supozoni se është dhënë klasa User, vetitë
e së cilës janë të disponueshme vetëm për lexim me ndihmën
e 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;
}
}
?>
Riktheni kodin e kësaj klase në mënyrë që në vend
të getters të përdoret metoda magjike
__get.