Tutorial OOP Dasar Pada PHP

Polymorphism

Materi ini memiliki 1 buah lampiran. Namun Anda tidak dapat mengakses lampiran karena belum terdaftar di kursus ini. Klik disini untuk mendaftar.

Pada video ini kita akan melanjutkan ke konsep berikutnya yang sangat penting dalam pemograman berbasis objek, yaitu Polymorphism.

Polymorphism berasal dari bahasa Yunani, yang berarti "bisa memiliki banyak bentuk". Dalam dunia nyata, manusia juga mengalami polymorphism. Dalam waktu yang sama, harus memiliki beberapa karakteristik yang berbeda. Misalnya seorang pria, dalam waktu yang sama harus menjadi seorang ayah, seorang suami dan seorang karyawan. Jadinya orang yang sama harus menunjukkan tingkah laku yang berbeda sesuai dengan perannya.

Di dalam dunia pemograman berbasis objek, Polymorphism berarti kemampuan untuk menggunakan objek dari kelas yang berbeda. Tetapi bukan berarti kita bisa menggunakan sembarangan kelas ya. Kita tetap harus mengikuti aturan dari Inheritance. Pada saat menggunakan polymorphism, kita hanya bisa menggunakan kelas yang merupakan keturunan dari kelas yang sedang ditunjuk.

Sebagai contoh, pada kode sebelumnya kita sudah memiliki kelas Student dan Teacher. Lalu pada pelajaran Inheritance, kita telah membuat kelas turunan dari Teacher menjadi kelas MathTeacher dan CodingTeacher.

Perhatikan source code di bagian bawah. Kita membuat function showTeacher dengan menggunakan parameter kelas Teacher. Pada saat kita memanggil function tersebut, kita bisa menggunakan kelas Teacher, MathTeacher ataupun kelas CodingTeacher. Namun kita tidak bisa menggunakan kelas Student karena kelas Student bukan merupakan keturunan dari kelas Teacher.

Polymorphism hanya berlaku untuk kelas yang merupakan keturunan dari kelas yang ditunjuk. Tidak berlaku untuk kelas yang merupakan parent-nya. Jadi kalau misalkan kita membuat function showTeacher dengan menggunakan kelas MathTeacher sebagai parameternya, maka kita tidak bisa menggunakan kelas Teacher sebagai argument-nya.

Kita coba praktek ya. Kita buka kembali source code sebelumnya. Kita buka file Teacher.php. Disini sudah ada kelas Teacher. Lalu kita telah membuat keturunan dari kelas Teacher dengan nama MathTeacher. MathTeacher memiliki property $subject dengan nilai 'Math' dan memiliki method showInformation yang melakukan overriding terhadap method milik parent-nya. Pada method showInformation, kita komentari kode yang memanggil parent-nya.

Lalu kita gandakan kode MathTeacher ya. Kita ubah menjadi kelas CodingTeacher. Kita ubah nilai $subject menjadi 'Coding'. Dan kita hapus method showInformation.

Kita lihat lagi kode kita ya. Jadi sekarang kita memiliki 4 kelas sesuai dengan slide. Pada file Student.php, kita membuat kelas Student. Lalu pada file Teacher.php, pertama kita membuat kelas Teacher. Lalu kita membuat 2 kelas turunannya, yaitu MathTeacher dan CodingTeacher.

Sekarang kita buat file baru yaitu polymorphism.php. Kita buat tag pembuka PHP. Pertama kita panggil dahulu require_once untuk file 'class/Teacher.php' dan 'class/Student.php'. Kemudian kita buat function seperti pada slide ya. Function showTeacher, dengan parameter berupa kelas Teacher $teacher. Isinya kita memanggil method showInformation pada parameter $teacher.

Selanjutnya kita panggil function showTeacher dengan menggunakan argument new kelas Teacher. Kita coba jalankan file polymorphism.php. Dan kita mendapatkan error ya. Kita tidak bisa menggunakan property $name karena belum pernah diisi nilai.

Untuk itu kita perlu membuat constructor agar kita bisa mengisi nilai $name dan $classroom. Kita ulangi sebentar materi sebelumnya mengenai Constructor ya. Apakah teman-teman masih ingat cara membuat constructor? Kita buka kembali file Teacher.php.

Lalu pada kelas Teacher kita tambahkan function spesialnya constructor. Pada bahasa pemograman PHP, nama functionnya harus __construct. Kita tambahkan 2 parameter yaitu string $name dan string $classroom. Lalu pada isi function kita pindahkan nilai parameter ke dalam property.

Kita buka kembali file polymorphism. Pada saat membuat kelas Teacher, kita harus tambahkan 2 argument ya. Kita tambahkan argument 'Skysen', dan '2C'. Lalu kita jalankan. Maka kita mendapatkan hasil yang menampilkan nama dan kelas.

Sesuai dengan konsep polymorphism, kita bisa menggunakan kelas turunan dari Teacher sebagai argument ya. Kita coba ganti kelasnya menjadi MathTeacher. Kita jalankan. Tidak ada error ya. Dan yang lebih kerennya lagi, ternyata method overriding tetap berjalan pada polymorphism. Method showInformation yang dijalankan adalah versi MathTeacher, dimana method ini menampilkan $subject yang diajarkan oleh guru.

Kita bisa mengganti kelas argument menjadi CodingTeacher. Pada saat dijalankan, kita mendapatkan tulisan nama dan kelas. Hal ini terjadi karena pada CodingTeacher, kita tidak melakukan overriding terhadap method showInformation. Jadi kita menggunakan method versi parent-nya.

Kita coba beberapa hal yang menyebabkan error pada polymorphism ya. Yang pertama adalah kita tidak boleh menggunakan kelas yang bukan merupakan turunan dari Teacher. Sebagai contoh, kelasnya saya ganti menjadi Student. Maka hasilnya error. Karena kelas Student sama sekali tidak berhubungan dengan kelas Teacher.

Yang kedua adalah polymorphism tidak dapat digunakan untuk parent class. Sebagai contoh, parameter kita ganti menjadi MathTeacher. Namun pada argument, kita menggunakan kelas Teacher. Maka kita tetap mendapatkan error ya. Polymorphism hanya bisa digunakan pada kelas turunan, dan tidak bisa digunakan pada kelas parent. Kita kembalikan dahulu kode kita menjadi kode yang berjalan benar.

Berhubung polymorphism memungkinkan kita untuk menggunakan objek dari kelas lain, maka kita memerlukan cara untuk memeriksa apakah kelas yang sedang digunakan oleh objek tersebut. Disini kita bisa menggunakan operator instanceof.

Operator instanceof mengembalikan nilai true, apabila objek dibuat dari kelas yang disebutkan. Namun disini perlu diperhatikan bahwa operator instanceof juga mengembalikan nilai true apabila objek dibuat dari kelas yang merupakan turunan dari kelas yang disebutkan. Operator instanceof juga mengembalikan nilai true apabila objek mengimplementasikan interface yang disebutkan. Untuk saat ini kita masih belum membahas mengenai interface ya, nantinya akan kita bahas pada playlist pemograman berbasis objek berikutnya. Operator instanceof mengembalikan nilai false apabila objek tidak dibuat dari kelas ataupun interface yang disebutkan.

Agar lebih jelas, kita coba praktek. Kita buka lagi file polymorphism.php. Kita komentari dahulu kode kita yang sebelumnya agar hasil coding kita bisa lebih jelas ya.

Kita tambahkan kode baru. Misalkan kita buat variable $object, yang kita buat dari kelas Teacher dengan argument 'Skysen' dan '2C'. Lalu kita panggil operator instanceof untuk memeriksa apakah $object dibuat dari kelas Teacher. Cara menggunakannya adalah kita sebutkan dahulu varible $object diikuti oleh tanda spasi, lalu operator instanceof, dan tanda spasi lagi. Lalu kita sebutkan nama kelasnya yaitu Teacher. Agar hasilnya ditampilkan di layar, maka kita gunakan perintah var_dump.

Kita jalankan dan hasilnya adalah boolean true. Perhatikan lagi ya instanceof adalah sebuah operator. Jadi untuk menggunakannya kita menggunakan tanda spasi. Bukan tanda kurung seperti function.

Nah, yang perlu diperhatikan lagi, ternyata kalau $object kita buat dari kelas MathTeacher, ternyata instanceof Teacher menghasilkan nilai true. Mengapa? Karena kelas MathTeacher adalah turunan dari kelas Teacher.

Walaupun intanceof memberikan nilai true untuk keturunan, namun bukan berarti menghasilkan nilai true untuk parent ya. Kalau misalnya kita balik. Kita membuat $object yang merupakan kelas dari Teacher, namun kita periksa apakah $object merupakan instanceof MathTeacher, maka kita mendapatkan nilai false. Hal ini disebabkan karena Teacher adalah parent dari MathTeacher.

Sejak PHP versi 8, operator instanceof dapat digunakan seperti function. Kita bisa memanggil instanceof diikuti oleh tanda kurung. Namun nama kelasnya harus dalam bentuk string. Jadi kita harus menambahkan tanda petik di bagian awal dan akhir kelas. Kalau dijalankan maka hasilnya false ya, namun tidak terjadi error.

Dengan menggunakan argument berupa string, kita bisa secara dinamis menentukan nama kelas yang hendak kita cek. Karena disini kita bisa menggunakan operasi string, misalkan 'Math' . 'Teacher'.

Bagaimana contoh dari penggunaan instanceof? Nah, kita komentari lagi kode baru kita dan kita buka kode lama kita.

Kita pindah ke file Teacher.php. Misalkan, khusus pada CodingTeacher, kita buat method baru dengan writeCode, dengan hasil void. Di dalamnya kita echo "{$this->name} is writing Code\n". Jadi khusus hanya CodingTeacher saja memiliki method writeCode.

Kita kembali ke file polymorphism. Untuk saat ini, kalau kita membuat argument dari kelas Teacher. Maka kita mendapatkan nama dan kelas. Kalau argument berupa MathTeacher, maka kita mendapatkan subjek. Sedangkan kalau argument dari CodingTeacher, kita kembali mendapatkan nama dan kelas.

Kita ingin mengganti kode di dalam function, agar kalau kita menggunakan CodingTeacher, kita memanggil method khususnya yaitu writeCode. Bagaimana caranya? Kita tambahkan if. Bila parameter $teacher adalah kelas CodingTeacher, maka kita panggil method writeCode. Selain itu barulah kita panggil method showInformation.

Sekarang kalau kita jalankan menggunakan CodingTeacher, maka kita mendapatkan hasil 'Skysen is writing code'. Kalau menggunakan MathTeacher hasilnya subject. Sedangkan kalau menggunakan Teacher maka hasilnya nama dan kelas.

Jadi kita bisa menggunakan instanceof untuk menjalankan kode yang berbeda khusus pada kelas tertentu seperti CodingTeacher. Yang perlu diperhatikan disini adalah operator instanceof tetap memberikan hasil true apabila objek dibuat dari kelas turunan. Oleh karena itu kalau kita hendak memeriksa banyak kelas di dalam percabangan bersarang, maka kita harus memeriksa kelas anak terlebih dahulu. Setelah itu barulah kita memeriksa kelas parent-nya.

2 Jam 41 Menit

Dengan menggunakan fasilitas tanya jawab, maka Anda bisa bertanya dan akan dijawab langsung oleh instruktur kursus.

Anda belum terdaftar pada kursus ini sehingga tidak bisa mengajukan pertanyaan.