Abstrak: Artikel ini akan membahas tentang konsep polimorfisme dan penerapannya dalam desain berorientasi objek. Artikel ini juga akan menganalisis cara menggunakan polimorfisme di PHP 5 serta kelebihan dan kekurangannya.
Dukungan untuk pengikatan yang terlambat telah diterapkan pada rilis terbaru PHP. Tentu saja masih banyak kendala saat menggunakan fungsi pengikatannya yang terlambat. Jika Anda menggunakan PHP versi lama (server saya menjalankan PHP 5.0.1), Anda mungkin menemukan bahwa dukungan untuk pengikatan yang terlambat kurang. Oleh karena itu, harap diperhatikan bahwa kode dalam artikel ini mungkin tidak berfungsi di versi spesifik PHP 5 Anda.
1. PHP 5 dan Polimorfisme
Artikel ini ingin membahas salah satu bagian terpenting dari pemrograman berorientasi objek - desain polimorfisme. Untuk mengilustrasikan masalahnya, saya menggunakan PHP 5. Sebelum Anda melanjutkan membaca, harap jelaskan bahwa artikel ini tidak sepenuhnya tentang PHP. Meskipun bahasa ini telah membuat kemajuan besar dalam perkembangan pesat selama dua versi utama terakhir, dukungan objeknya masih memiliki waktu sebelum dapat menyaingi bahasa yang lebih matang seperti C++ atau kursus Java.
Jika Anda seorang pemula dalam pemrograman berorientasi objek, artikel ini mungkin tidak cocok untuk Anda, karena bagian polimorfisme ini istimewa: setelah Anda memahaminya, Anda tidak akan pernah melupakannya. Jika Anda ingin belajar sedikit tentang pemrograman dan desain objek, dan Anda tidak begitu tahu apa artinya ketika seseorang mengatakan "suatu objek adalah polimorfik", maka artikel ini cocok untuk Anda.
Di akhir artikel ini, Anda akan mengetahui apa itu polimorfisme dan bagaimana menerapkannya pada desain berorientasi objek, dan Anda akan memahami kelebihan dan kekurangan pemrograman objek di PHP 5.
2. Apa itu polimorfisme?
Definisi polimorfisme dari kamus.com adalah “terjadi dalam berbagai bentuk, tahapan, atau jenis dalam organisasi independen atau dalam organisasi yang sama tanpa perbedaan mendasar.” Dari definisi ini, kita dapat berpikir bahwa polimorfisme Seksualitas adalah cara pemrograman untuk menggambarkan hal yang sama objek melalui beberapa keadaan atau fase. Padahal, arti sebenarnya adalah dalam pengembangan sebenarnya, kita hanya perlu fokus pada pemrograman antarmuka atau kelas dasar, dan tidak perlu khawatir tentang kelas (kelas) tertentu yang dimiliki suatu objek.
Jika Anda sudah familiar dengan pola desain, meskipun Anda baru memiliki pemahaman awal, maka Anda akan memahami konsep ini. Faktanya, polimorfisme mungkin merupakan alat terhebat dalam pemrograman desain berbasis pola. Hal ini memungkinkan kita untuk mengatur objek serupa dengan cara yang logis sehingga kita tidak perlu khawatir tentang tipe objek tertentu saat membuat kode; terlebih lagi, kita hanya perlu memprogram antarmuka atau kelas dasar yang diinginkan; Semakin abstrak suatu aplikasi, semakin fleksibel aplikasi tersebut -- dan polimorfisme adalah salah satu cara terbaik untuk melakukan perilaku abstrak.
Sebagai contoh, mari kita pertimbangkan sebuah kelas bernama Person. Kita dapat mensubkelaskan Person dengan kelas yang disebut David, Charles dan Alejandro. Seseorang memiliki metode abstrak AcceptFeedback(), dan semua subkelas harus mengimplementasikan metode ini. Artinya, kode apa pun yang menggunakan subkelas dari kelas dasar Person dapat memanggil metode AcceptFeedback(). Anda tidak perlu memeriksa apakah objek tersebut adalah David atau Alejandro, cukup dengan mengetahui bahwa itu adalah Person. Akibatnya, kode Anda hanya perlu fokus pada "penyebut umum terendah" - kelas Person.
Kelas Person dalam contoh ini juga dapat dibuat sebagai antarmuka. Tentu saja, ada beberapa perbedaan dibandingkan dengan yang di atas, terutama: antarmuka tidak memberikan perilaku apa pun, tetapi hanya menentukan seperangkat aturan. Antarmuka Person memerlukan "Anda harus mendukung metode AddFeedback()", sedangkan kelas Person dapat memberikan beberapa kode default untuk metode AddFeedback() - pemahaman Anda tentang hal ini dapat berupa "Jika Anda tidak memilih untuk mendukung AddFeedback(), maka Anda harus menyediakan implementasi default. "Cara memilih antarmuka atau kelas dasar berada di luar topik artikel ini; namun, secara umum, Anda perlu mengimplementasikan metode default melalui kelas dasar. Anda juga dapat menggunakan antarmuka jika Anda dapat menguraikan serangkaian fungsi yang diinginkan yang diimplementasikan oleh kelas Anda.
3. Menerapkan desain polimorfik
Kita akan terus menggunakan contoh kelas dasar Person, dan sekarang mari kita menganalisis implementasi non-polimorfik. Contoh berikut menggunakan tipe objek Person yang berbeda - cara pemrograman yang sangat tidak memuaskan. Perhatikan bahwa kelas Person sebenarnya dihilangkan. Sejauh ini, kami hanya peduli pada masalah pemanggilan kode.
<?php
$nama = $_SESSION['nama'];
$Person Saya = Orang::GetPerson($nama);
beralih (get_class($myPerson)){
kasus 'Daud' :
$myPerson->AddFeedback('Artikel Hebat!', 'Beberapa Pembaca', tanggal('Ym-d'));
merusak;
kasus 'Charles':
$myPerson->feedback[] = array('Beberapa Pembaca', 'Pengeditan Hebat!');
merusak;
kasus 'Alejandro' :
$myPerson->Umpan Balik->Tambahkan('Javascript Luar Biasa!');
merusak;
bawaan :
$myPerson->TambahkanUmpan Balik('Hore!');
}
?>
Contoh ini menunjukkan objek dengan perilaku berbeda, dan pernyataan switch digunakan untuk membedakan objek kelas Person yang berbeda sehingga dapat melakukan operasi masing-masing dengan benar. Perhatikan bahwa komentar umpan balik di sini berbeda untuk kondisi yang berbeda. Ini mungkin tidak terjadi dalam pengembangan aplikasi nyata; saya hanya menggambarkan perbedaan yang ada dalam implementasi kelas.
Contoh di bawah ini menggunakan polimorfisme.
<?php
$nama = $_SESSION['nama'];
$Person Saya = Orang::GetPerson($nama);
$myPerson->AddFeedback('Artikel Hebat!', 'SomeReader', date('Ym-d'));
?>
Perhatikan bahwa tidak ada pernyataan switch di sini, dan yang paling penting, kurangnya informasi tentang jenis objek Person::GetPerson() yang akan dikembalikan. Dan Person::AddFeedback() lainnya adalah metode polimorfik. Perilaku sepenuhnya dikemas dalam kelas-kelas konkrit. Ingat, apakah kita menggunakan David, Charles, atau Alejandro di sini, kode pemanggil tidak harus mengetahui apa yang dilakukan kelas konkret, hanya kelas dasar.
Meskipun contoh saya tidak sempurna, contoh ini menunjukkan penggunaan dasar polimorfisme dari perspektif kode pemanggil. Sekarang kita perlu menganalisis implementasi internal kelas-kelas ini. Salah satu hal hebat tentang turunan dari kelas dasar adalah bahwa kelas turunan dapat mengakses perilaku kelas induk. Hal ini sering kali merupakan implementasi default, namun dapat juga terjadi dalam rantai pewarisan kelas untuk menciptakan perilaku yang lebih kompleks. Di bawah ini adalah demonstrasi sederhana dari situasi ini.
<?php
Orang kelas{
fungsi TambahkanUmpan Balik($komentar, $pengirim, $tanggal){
//Tambahkan masukan ke database}
}
kelas David memperluas Person{
fungsi TambahkanUmpan Balik($komentar, $pengirim){
induk::TambahkanUmpan Balik($komentar, $pengirim,
tanggal('Ym-d'));
}
}
?>
Di sini, metode Person::AddFeedback pertama kali dipanggil dalam implementasi metode AddFeedback di kelas David. Anda mungkin memperhatikan bahwa ini meniru metode kelebihan beban di C++, Java, atau C#. Ingatlah bahwa ini hanyalah contoh sederhana dan kode sebenarnya yang Anda tulis sepenuhnya bergantung pada proyek Anda yang sebenarnya.
4. Keterlambatan pengikatan di PHP 5
Menurut pendapat saya, pengikatan yang terlambat adalah alasan penting mengapa Java dan C# begitu menarik. Mereka mengizinkan metode kelas dasar untuk memanggil metode menggunakan "ini" atau $ini (meskipun metode tersebut tidak ada di kelas dasar atau pemanggilan metode di kelas dasar dapat digantikan oleh versi lain di kelas yang diwarisi). Anda dapat mempertimbangkan implementasi berikut yang diperbolehkan di PHP:
<?php
Orang kelas{
fungsi TambahkanUmpan Balik($messageArray) {
$ini->ParseFeedback($messageArray);
//Menulis ke database}
}
kelas David memperluas Person{
fungsi ParseFeedback($messageArray){
// Lakukan analisis}
}
?>
Ingat, tidak ada ParseFeedback di kelas Person. Sekarang, dengan asumsi Anda memiliki bagian kode implementasi ini (demi contoh ini), ini akan menyebabkan $myPerson menjadi objek David:
<?php
$Person Saya = Orang::GetPerson($nama);
$myPerson->TambahkanUmpan Balik($messageArray);
?>
Terjadi kesalahan analisis! Pesan kesalahan umum adalah metode ParseFeedback tidak ada atau informasi serupa. Mari kita bicara tentang pengikatan yang terlambat di PHP 5! Selanjutnya, mari kita rangkum konsep pengikatan terlambat.
Pengikatan yang terlambat berarti pemanggilan metode tidak terikat ke objek target hingga saat-saat terakhir. Artinya ketika metode dipanggil saat runtime, objek tersebut sudah memiliki tipe yang konkrit. Dalam contoh kita di atas, Anda memanggil David::AddFeedback(), dan karena $this di David::AddFeedback() mengacu pada objek David, Anda secara logis dapat berasumsi bahwa metode ParseFeedback() ada - namun kenyataannya tidak. ada karena AddFeedback() didefinisikan dalam Person dan ParseFeedback() dipanggil dari kelas Person.
Sayangnya, tidak ada cara mudah untuk menghilangkan perilaku ini di PHP 5. Ini berarti Anda mungkin sedikit tidak berdaya saat ingin membuat hierarki kelas polimorfik yang fleksibel.
Saya harus menunjukkan bahwa saya memilih PHP 5 sebagai bahasa ekspresi untuk artikel ini hanya karena: bahasa ini tidak mewujudkan abstraksi sempurna dari konsep objek! Hal ini dapat dimaklumi karena PHP 5 masih dalam versi beta. Selain itu, sekarang kelas abstrak dan antarmuka telah ditambahkan ke bahasa, pengikatan yang terlambat juga harus diterapkan.
5. Ringkasan
Pada titik ini, Anda harus memiliki pemahaman dasar tentang apa itu polimorfisme dan mengapa PHP 5 tidak sempurna dalam mencapai polimorfisme. Secara umum, Anda harus mengetahui cara menggunakan model objek polimorfik untuk merangkum perilaku bersyarat. Tentu saja, hal ini meningkatkan fleksibilitas objek Anda dan berarti lebih sedikit kode untuk diimplementasikan. Selain itu, Anda meningkatkan kejelasan kode Anda dengan merangkum perilaku yang memenuhi kondisi tertentu (bergantung pada keadaan objek).