Selain membatasi akses, metode akses juga menentukan metode mana yang akan dipanggil oleh subkelas atau properti mana yang akan diakses oleh subkelas. Hubungan antara pemanggilan fungsi dan fungsi itu sendiri, serta hubungan antara akses anggota dan alamat memori variabel, disebut pengikatan.
Dalam bahasa komputer Ada dua cara utama pengikatan? Pengikatan statis dan pengikatan dinamis. Pengikatan statis terjadi antara struktur data dan struktur data, sebelum program dijalankan. Pengikatan statis terjadi pada waktu kompilasi, sehingga tidak dapat menggunakan runtime apa pun informasi. Ini menargetkan panggilan fungsi dan isi fungsi, atau variabel dan blok dalam memori. Karena PHP adalah bahasa dinamis, ia tidak menggunakan pengikatan statis. Namun, ia dapat mensimulasikan pengikatan statis.
Pengikatan dinamis menargetkan akses yang dihasilkan selama runtime
.Permintaan hanya menggunakan informasi yang tersedia saat runtime. Dalam kode berorientasi objek, pengikatan dinamis berarti bahwa keputusan tentang metode mana yang dipanggil atau properti mana yang diakses akan didasarkan pada kelas itu sendiri dan bukan pada cakupan akses
anggota publik dan dilindungi mirip dengan tindakan fungsi di versi PHP sebelumnya, menggunakan pengikatan dinamis Artinya, jika suatu metode mengakses anggota kelas yang ditimpa dalam suatu subkelas, dan merupakan turunan dari subkelas tersebut, anggota subkelas tersebut akan diakses (bukannya mengakses anggota). di kelas induk).
Lihat Gambar 1. Kode ini menampilkan "Hei! Saya Anak." Karena ketika PHP memanggil getSalutation, itu adalah turunan dari Anak, yang menimpa salam di Ayah akan menghasilkan hasil yang sama. Mengganti suatu metode beroperasi dengan cara yang sama. Di Son, panggilan untuk mengidentifikasi terikat pada metode itu.
Bahkan dalam subkelas, mode akses dilemahkan dari protected ke public , pengikatan dinamis akan tetap terjadi prinsip penggunaan metode akses, tidak mungkin untuk meningkatkan pembatasan akses pada anggota kelas. Oleh karena itu, mengubah metode akses dari publik menjadi terlindungi
tidak
mungkin
kelas Ayah
{
protected $salam = "Halo!" //Salam
fungsi publik getSalutation()
{
print("$ini->salamn");
$ini->identifikasi();
}
fungsi yang dilindungi identifikasi()
{
print("Saya Ayah.n");
}
};
kelas Anak memperluas Ayah
{
protected $salutation = "Hei!"; //protected $salutation di kelas induk ditimpa
fungsi yang dilindungi identifikasi() //identifikasi yang dilindungi() di kelas induk ditimpa
{
print("Saya Anak.n");
}
};
$obj = Anak baru();
$obj->getSalutation(); //Keluaran Hai!
?>
//Catatan: getSalutation() tidak diganti di subkelas, namun sebenarnya masih ada getSalutation(). $salamutation dan identifikasi() di kelas ini
//sama dengan getSalutation() pada instance Son subkelas Metode ini terikat secara dinamis, jadi memanggil metode getSalutation() dari instance Son
akan memanggil salam anggota dan identifikasi() di kelas Putra, bukan salam anggota dan identifikasi() di kelas induk
yang hanya ada di dalamnya Di dalam kelas di mana ia berada. Tidak seperti anggota publik dan dilindungi, PHP mensimulasikan pengikatan statis. Lihat contoh pada Gambar 2. Ini menampilkan "Halo! Saya Ayah.", meskipun subkelasnya mengesampingkan nilai salam. .Script akan this- >salam terikat ke kelas saat ini Ayah. Prinsip serupa berlaku untuk metode privat identifikasi
(
)
kelas Ayah
{
private $salam = "Halo!";
fungsi publik getSalutation()
{
print("$ini->salamn");
$ini->identifikasi();
}
fungsi pribadi identifikasi()
{
print("Saya Ayah.n");
}
}
kelas Anak memperluas Ayah
{
pribadi $salam = "Hai!";
identifikasi fungsi pribadi()
{
print("Saya Anak.n");
}
}
$obj = Anak baru();
$obj->getSalutation(); //Output Halo! Saya Ayah.
?>
Keuntungan dari pengikatan dinamis adalah memungkinkan kelas yang diwarisi untuk mengubah perilaku kelas induk sambil mempertahankan antarmuka dan fungsi kelas induk. Lihat contoh Gambar 3. Karena penggunaan pengikatan dinamis, versi isAuthorized disebut di deleteUser dapat Ditentukan oleh jenis objek. Jika itu adalah pengguna biasa, pemanggilan PHP User::isAuthorized akan mengembalikan FALSE. Jika itu adalah turunan dari AuthorizedUser, pemanggilan PHP AuthorizedUser::isAuthorized akan memungkinkan deleteUser untuk dieksekusi dengan lancar
//
.haohappy Catatan: gunakan Untuk membuatnya lebih jelas dalam satu kalimat, ini adalah pengikatan tipe objek, metode, dan atribut. Saat memanggil metode yang ada di kelas induk dan subkelas atau mengakses suatu atribut, pertama-tama ia akan menentukan tipe objek yang mana instance miliknya, lalu panggil metode di kelas dan atribut yang sesuai.
Manfaat pengikatan dinamis
<?php
kelas Pengguna //pengguna
{
fungsi yang dilindungi isAuthorized() //Apakah itu pengguna yang diautentikasi
{
kembali(SALAH);
}
fungsi publik getName() //Dapatkan namanya
{
return($ini->nama);
}
fungsi publik deleteUser($nama pengguna) //Hapus pengguna
{
jika(!$ini->isAuthorized())
{
print("Anda tidak berwenang.n");
kembali(SALAH);
}
//menghapus pengguna
print("Pengguna dihapus.n");
}
}
kelas AuthorizedUser memperluas Pengguna //Otentikasi pengguna
{
fungsi yang dilindungi isAuthorized() //timpa isAuthorized()
{
kembali(BENAR);
}
}
$pengguna = Pengguna baru;
$admin = Pengguna Resmi baru;
//tidak diotorisasi
$pengguna->deleteUser("Zeev");
//diotorisasi
$admin->deleteUser("Zeev");
?>
Mengapa anggota kelas privat melakukan simulasi pengikatan statis? Untuk menjawab pertanyaan ini, Anda perlu mengingat kembali mengapa Anda perlu memiliki anggota privat. Kapan masuk akal untuk menggunakannya daripada anggota
privat hanya jika Anda tidak menginginkannya subkelas yang diwarisi Digunakan hanya ketika mengubah atau mengkhususkan perilaku kelas induk. Ini lebih jarang dari yang Anda kira. Secara umum, hierarki objek yang baik harus memungkinkan sebagian besar fungsionalitas dispesialisasikan, ditingkatkan, atau diubah berdasarkan subkelas? dasar-dasar pemrograman berorientasi objek. Metode atau variabel privat diperlukan dalam situasi tertentu, seperti ketika Anda yakin tidak ingin mengizinkan subkelas mengubah bagian tertentu dari kelas induk.