Properti Hanya Baca dalam OOP di PHP
Mari kita lihat kelas di mana semua properti bersifat privat:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Sekarang mari kita buat agar properti-properti ini di dunia luar hanya dapat dibaca. Sebelumnya kita sudah melakukan hal seperti ini, dengan membuat getter untuk setiap properti dan tidak membuat setter.
Sekarang mari kita gunakan metode ajaib
__get untuk menyelesaikan tugas ini. Kita akan mengembalikan
nilai properti yang diminta di dalamnya. Bagaimana
caranya: nama properti yang diminta masuk
ke dalam parameter metode __get, dalam kasus kita
$property.
Ini berarti kita dapat membaca properti,
yang namanya disimpan dalam variabel, seperti ini:
$this->$property (nama properti akan menjadi
variabel, yaitu dengan tanda dolar di awal, kita
telah mempelajari ini dalam pelajaran sebelumnya).
Mari kita buat metode __get yang telah dijelaskan:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Mari kita gunakan untuk membaca properti:
<?php
$test = new Test;
echo $test->prop1; // akan menampilkan 1
echo $test->prop2; // akan menampilkan 2
?>
Upaya untuk menulis sesuatu ke properti akan menyebabkan error:
<?php
$test = new Test;
$test->prop1 = 2; // akan menghasilkan error
?>
Ini tepat yang kita butuhkan: properti dapat dibaca, tetapi tidak dapat ditulis.
Upaya untuk membaca properti yang tidak ada akan menghasilkan error:
<?php
$test = new Test;
echo $test->prop3; // akan menghasilkan error
?>
Perhatikan juga nuansa berikut: ketika kita membuat properti hanya untuk dibaca dengan cara lama, maka untuk membaca properti, kita menggunakan metode getter.
Dalam cara baru, kita akan mengakses properti secara langsung, seolah-olah mereka publik. Tetapi menulis ke dalamnya tidak akan bisa, seolah-olah mereka privat.
Misalkan diberikan kelas User berikut, yang propertinya
hanya dapat dibaca dengan menggunakan
getter:
<?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;
}
}
?>
Ubah kode kelas ini sehingga alih-alih
getter, digunakan metode ajaib
__get.