Metode akses PHP5 memungkinkan pembatasan akses ke anggota kelas. Ini adalah fitur baru di PHP5, namun sudah lama ada di banyak bahasa berorientasi objek. Dengan metode akses, Anda bisa mengembangkan aplikasi berorientasi objek yang andal dan membangun perpustakaan kelas berorientasi objek yang dapat digunakan kembali.
Seperti C++ dan Java, PHP memiliki tiga metode akses: publik, pribadi, dan terlindungi. Metode akses untuk anggota kelas dapat menjadi salah satunya. Jika Anda tidak menentukan metode akses, metode akses default adalah publik Anggota statis menentukan metode akses. Tempatkan metode akses sebelum kata kunci statis (seperti public static).
Anggota publik dapat diakses tanpa batasan. Kode apa pun di luar kelas dapat membaca dan menulis properti publik skrip. Panggil metode publik di mana saja. Pada versi PHP sebelumnya, semua metode dan properti bersifat publik, sehingga objek terlihat seperti array yang terstruktur dengan baik.
Anggota pribadi hanya terlihat di dalam kelas. Anda tidak dapat mengubah atau membaca nilai properti pribadi di luar metode kelas tempatnya berada. Demikian pula, hanya metode di kelas yang sama yang dapat memanggil metode privat, dan subkelas yang diwarisi tidak dapat mengakses anggota privat di kelas induk.
Perhatikan bahwa anggota pribadi dapat diakses oleh anggota kelas mana pun dan oleh instance kelas. Melihat Contoh 6.8, metode yang sama membandingkan dua widget. Operator == membandingkan dua objek dari kelas yang sama, namun dalam contoh ini setiap instance objek memiliki ID unik. Perhatikan bagaimana metode yang sama mengakses properti pribadi dari instance Widget lain.
Listing 6.8
Widget kelas
anggota pribadi
{
pribadi $nama;
pribadi $harga;
pribadi $id;
fungsi publik __konstruksi($nama, $harga)
{
$ini->nama = $nama;
$ini->harga = floatval($harga);
$ini->id = uniqid();
}
//memeriksa apakah dua widget memiliki fungsi publik yang sama($widget)
{
return(($ini->nama == $widget->nama)AND ($ini->harga == $widget->harga));
}
}
$w1 = Widget baru('Gigi', 5.00);
$w2 = Widget baru('Gigi', 5.00);
$w3 = Widget baru('Gigi', 7.00);
//BENAR
if($w1->sama dengan($w2))
{
print("w1 dan w2 sama n");
}
//PALSU
if($w1->sama dengan($w3))
{
print("w1 dan w3 sama n");
}
//FALSE, == menyertakan id sebagai perbandingan
if($w1 == $w2) //tidak sama karena ID-nya berbeda
{
print("w1 dan w2 sama n");
}
?>
Jika Anda baru mengenal pemrograman berorientasi objek, Anda mungkin bertanya-tanya apa tujuan menggunakan anggota privat. Anda mungkin ingat ide enkapsulasi dan penggandengan, yang telah kita bahas di awal bab ini. Anggota pribadi membantu merangkum data. Mereka dapat disembunyikan di dalam kelas agar tidak dapat diakses oleh kode di luar kelas. Mereka juga membantu mencapai kopling longgar. Jika kode di luar struktur data tidak dapat langsung mengakses properti internal, maka tidak ada korelasi implisit.
Tentu saja, sebagian besar properti pribadi masih dapat dibagikan melalui kode eksternal. Solusinya adalah dengan menggunakan sepasang metode publik, yang satu adalah get (mendapatkan nilai properti), yang lainnya adalah set (menetapkan nilai properti). Konstruktor juga menerima nilai awal untuk properti. Hal ini memungkinkan komunikasi antar anggota terjadi melalui antarmuka yang sempit dan berkualifikasi baik. Hal ini juga memberikan peluang untuk mengubah nilai yang diteruskan ke metode Jadikan harga sebagai angka mengambang (floadval()).
Anggota yang dilindungi (dilindungi) dapat diakses oleh semua metode di kelas yang sama dan semua metode di kelas yang diwarisi. Properti publik bertentangan dengan semangat enkapsulasi karena memungkinkan subkelas mengandalkan properti tertentu untuk menulis. Metode yang dilindungi tidak menimbulkan masalah ini. Subkelas yang menggunakan metode yang dilindungi harus sangat menyadari struktur kelas induknya .
Contoh 6.9 ditingkatkan dari Contoh 6.8 dan mencakup subkelas Benda dari Widget. Perhatikan bahwa Widget sekarang memiliki metode yang dilindungi yang disebut getName. Jika instance Widget mencoba memanggil metode yang dilindungi, kesalahan akan terjadi: $w1->getName() menghasilkan kesalahan, tetapi metode getName di subkelas Thing dapat memanggil metode ini dilindungi. Tentu saja, contoh ini terlalu sederhana untuk membuktikan bahwa metode Widget::getName dilindungi. Dalam situasi sebenarnya, penggunaan metode yang dilindungi bergantung pada pemahaman struktur internal objek.
Listing 6.9
Widget kelas
anggota yang dilindungi
{
pribadi $nama;
pribadi $harga;
pribadi $id;
fungsi publik __konstruksi($nama, $harga)
{
$ini->nama = $nama;
$ini->harga = floatval($harga);
$ini->id = uniqid();
}
//memeriksa apakah dua widget sama
fungsi publik sama dengan($widget)
{
return(($ini->nama == $widget->nama)AND($ini->harga == $widget->harga));
}
fungsi yang dilindungi getName()
{
return($ini->nama);
}
}
kelas Hal memperluas Widget
{
pribadi $warna;
fungsi publik setColor($warna)
{
$ini->warna = $warna;
}
fungsi publik getColor()
{
return($ini->warna);
}
fungsi publik getName()
{
kembali(induk::getName());
}
}
$w1 = Widget baru('Gigi', 5.00);
$w2 = Hal baru('Gigi', 5.00);
$w2->setColor('Yellow');
//TRUE (masih!) Hasilnya masih benar
if($w1->sama dengan($w2))
{
print("w1 dan w2 sama n");
}
//cetak roda gigi keluaran roda gigi
print($w2->getNama());
?>
Subkelas dapat mengubah metode akses metode dengan mengesampingkan metode kelas induk. Jika Anda mengganti anggota kelas publik, maka anggota tersebut harus tetap bersifat publik di subkelasnya. Jika Anda mengganti anggota yang dilindungi, anggota tersebut dapat tetap dilindungi atau menjadi anggota privat yang masih terlihat hanya di kelas saat ini. Mendeklarasikan anggota dengan nama yang sama dengan anggota privat kelas induk hanya akan membuat anggota berbeda di kelas saat ini. Oleh karena itu, secara teknis Anda tidak dapat mengganti anggota privat.
Kata kunci Final adalah cara lain untuk membatasi akses ke metode anggota. Subkelas tidak dapat mengesampingkan metode yang ditandai sebagai final di kelas induk, dan kata kunci Final tidak dapat digunakan untuk atribut.