Sifat Baca Sahaja dalam OOP dalam PHP
Mari kita lihat kelas di mana semua sifat adalah peribadi:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Sekarang mari kita buat supaya sifat-sifat ini dalam dunia luar hanya boleh dibaca. Sebelum ini kita telah melakukan perkara sedemikian, dengan mencipta getter untuk setiap sifat dan tidak mencipta setter.
Sekarang untuk menyelesaikan tugas ini, mari kita gunakan
kaedah ajaib __get. Kita akan mengembalikan
nilai sifat yang diminta di dalamnya. Bagaimana
untuk melakukannya: nama sifat yang diminta masuk
ke dalam parameter kaedah __get, dalam kes kami
$property.
Ini bermakna kita boleh membaca sifat,
namanya disimpan dalam pembolehubah, seperti ini:
$this->$property (nama sifat akan
menjadi pembolehubah, iaitu dengan tanda dolar di awal, kita
telah mempelajari ini dalam pelajaran sebelumnya).
Mari buat kaedah __get yang diterangkan:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Mari gunakannya untuk membaca sifat:
<?php
$test = new Test;
echo $test->prop1; // akan memaparkan 1
echo $test->prop2; // akan memaparkan 2
?>
Cubaan untuk menulis sesuatu ke dalam sifat akan menyebabkan ralat:
<?php
$test = new Test;
$test->prop1 = 2; // akan memberikan ralat
?>
Ini tepat seperti yang kita perlukan: sifat boleh dibaca, tetapi tidak boleh ditulis.
Cubaan untuk membaca sifat yang tidak wujud akan memberikan ralat:
<?php
$test = new Test;
echo $test->prop3; // akan memberikan ralat
?>
Sila perhatikan juga nuansa berikut: apabila kita membuat sifat hanya untuk dibaca dengan cara lama, untuk membaca sifat, kita menggunakan kaedah getter.
Dalam cara baru, kita akan merujuk tepat kepada sifat, seolah-olah ia awam. Tetapi menulis ke dalamnya tidak akan berjaya, seolah-olah ia peribadi.
Katakan diberikan kelas User seperti berikut, sifat-sifatnya
hanya boleh 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 suai kod kelas ini supaya bukannya
getter, kaedah ajaib
__get digunakan.