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 mengikat.
Ada dua jenis pengikatan utama dalam bahasa komputer - pengikatan statis dan pengikatan dinamis. Pengikatan statis terjadi antara struktur data dan struktur data sebelum program dijalankan. Pengikatan statis terjadi pada waktu kompilasi dan oleh karena itu tidak dapat memanfaatkan informasi runtime apa pun. Ini menargetkan pemanggilan fungsi dan isi fungsi, atau variabel dan blok memori. Karena PHP adalah bahasa dinamis, maka tidak menggunakan pengikatan statis. Tapi pengikatan statis dapat disimulasikan.
Pengikatan dinamis hanya menggunakan informasi yang tersedia saat runtime untuk permintaan akses yang dihasilkan selama 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.
Tindakan anggota publik dan dilindungi serupa dengan tindakan fungsi di versi PHP sebelumnya, menggunakan pengikatan dinamis. Ini berarti bahwa jika suatu metode mengakses anggota kelas yang ditimpa dalam suatu subkelas dan merupakan turunan dari subkelas tersebut, maka anggota subkelas tersebut akan diakses (alih-alih mengakses anggota di kelas induk).
Lihat Contoh 6.10. Kode ini menampilkan "Hai! Saya Anak." Karena ketika PHP memanggil getSalutation, itu adalah turunan dari Anak, yang menimpa salam di Ayah. Jika salam bersifat publik, PHP akan menghasilkan Hasil yang sama pengoperasian metode yang diganti sangat mirip. Di Son, panggilan untuk mengidentifikasi terikat pada metode itu.
Bahkan jika metode akses dilemahkan dari dilindungi menjadi publik dalam suatu subkelas, pengikatan dinamis akan tetap terjadi Menurut prinsip penggunaan metode akses, tidak mungkin untuk meningkatkan pembatasan akses pada anggota kelas, sehingga mengubah metode akses dari publik menjadi publik menjadi metode akses. dilindungi tidak dapat dilanjutkan.
Listing 6.10 Pengikatan dinamis
kelas pengikatan dinamis Ayah
{
protected $salam = "Halo!" //Salam
fungsi publik getSalutation()
{
print("$ini->salam");
$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()
//Terikat secara dinamis ke metode getSalutation() pada instance subkelas Son, sehingga metode getSalutation() pada instance Son dipanggil,
//Salam anggota dan identifikasi() di kelas Son akan dipanggil, bukan salam anggota dan identifikasi() di kelas induk.
Anggota privat hanya ada di dalam kelas di mana mereka berada mensimulasikan Binding statis. Ia mencetak "Halo! Saya Ayah." Meskipun subkelas menimpa nilai salam, skrip mengikat ini->salam ke kelas Ayah saat ini. Prinsip serupa berlaku untuk metode privat identifikasi().
Listing 6.11 Anggota mengikat dan pribadi
kelas Ayah
{
private $salam = "Halo!";
fungsi publik getSalutation()
{
print("$ini->salam");
$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 diwariskan untuk mengubah perilaku kelas induk sambil mempertahankan antarmuka dan fungsi kelas induk. Lihat Contoh 6.12. Karena penggunaan pengikatan dinamis, versi isAuthorized dipanggil deleteUser dapat Ditentukan berdasarkan jenis objeknya. 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 dijalankan dengan lancar.
//haohappy Catatan: Sederhananya dalam satu kalimat, ini adalah tipe objek dan metode, pengikatan atribut. Saat memanggil metode yang ada di kelas induk dan subkelas atau mengakses atribut, pertama-tama metode tersebut akan menentukan tipe objek mana yang akan digunakan. instance milik, dan kemudian memanggil Metode dan properti di kelas yang sesuai.
Listing 6.12 Manfaat
kelas pengikatan dinamis 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 akan diwarisi Digunakan hanya ketika mengubah atau mengkhususkan perilaku kelas induk. Hal ini kurang umum daripada yang mungkin Anda bayangkan. Secara umum, hierarki objek yang baik harus memungkinkan sebagian besar fungsi dispesialisasikan, ditingkatkan, atau diubah berdasarkan subkelas— Ini salah satunya 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.