Tutorial OOP Lanjutan

Reflection

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 membicarakan mengenai Reflection, yaitu cara untuk mengambil informasi yang berhubungan dengan class, pada saat script sedang berjalan.

Untuk melakukan hal itu, kita menggunakan ReflectionClass. Informasi seperti apa yang bisa kita ambil? Kita bisa mengambil daftar property milik class, daftar method milik class dan daftar konstanta milik class. Kita juga bisa mengambil keterangan lain yang berkaitan dengan kelas tersebut seperti apakah kelas bersifat readonly, abstract, cloneable, iterable dan lain-lain.

Selain itu masih banyak keterangan mengenai kelas yang bisa kita dapatkan dari ReflectionClass. Termasuk interface apa saja yang diimplementasikan. Trait apa saja yang digunakan. Dan masih banyak informasi lainnya. Untuk dokumentasi lebih lengkap mengenai ReflectionClass, bisa kita baca dari link dibawah ini:

https://www.php.net/manual/en/class.reflectionclass.php

Berhubung method milik ReflectionClass berjumlah banyak, maka kita tidak membahas seluruhnya dalam video ini. Kita hanya mengambil contoh beberapa method yang umum digunakan, yaitu getProperties, getMethods dan getContants. Dari nama method-nya sudah menggambarkan kira-kira kegunaannya untuk apa.

Agar lebih jelas, kita coba praktek ya. Disini saya sudah menyediakan satu buah kelas Student yang mirip dengan praktek kita sebelumnya. Pada kelas Student terdapat satu buah konstanta SCHOOL_NAME. Terdapat 3 buah property name, classroom dan age. Dan terdapat satu buah method. Kita akan mencoba untuk mengambil konstanta, property dan method dari kelas Student dengan menggunakan ReflectionClass.

Selanjutnya kita buat file baru dengan nama reflection.php. Pertama kita require_once dahulu file ‘class/Student.php’. Kemudian kita buat object-nya dengan kode $student = new Student().

Kita coba buat ReflectionClass. Pertama kita buat dahulu variable-nya $reflection untuk menampung object ReflectionClass dengan argument $student. Artinya kita menggunakan object $student untuk mengambil struktur kelasnya. Pertama kita var_dump dahulu nilai dari $reflection. Kita lihat hasilnya ya. Object ReflectionClass dengan satu buah property name, yang nilainya adalah ‘Student’. Student disini adalah nama kelasnya ya.

Kita coba ambil property apa saja yang dikandung oleh kelas Student. Sebenarnya kita sudah tau ada 3 property yaitu name, classroom dan age. Namun kita ingin mengambil ketiga property tersebut pada saat script dijalankan. Caranya? Kita buat variable $properties. Berhubung kita menggunakan bahasa Inggris untuk penamaan, maka kita menambahkan huruf s di bagian belakang sebagai bentuk jamak. Artinya variable ini berbentuk array yang bisa menyimpan banyak nilai. Nilainya kita ambil dari $reflection->getProperties(). Kita coba var_dump.

Hasilnya kita mendapatkan sebuah array yang isi-nya ada 3 buah object. Jenis object yang digunakan adalah ReflectionProperty. Setiap object memiliki property name dan class. Kalau kelasnya semuanya bernilai sama yaitu “Student”. Sedangkan untuk name-nya adalah nama property-nya yaitu “name”, “classroom” dan “age”.

Kalau kita ingin melakukan loop untuk semua isi array $properties, maka kita bisa menggunakan sintaks foreach($properties as $property). Kembali lagi disini menggunakan bahasa Inggris lebih nyaman ya. Karena kita bisa membedakan kata property dalam bentuk jamak dan dalam bentuk tunggal. Di dalam foreach, kita tuliskan nama property-nya. Kodenya menjadi echo $property->name . PHP_EOL.

Selanjutnya, kalau kita ingin tau apa saja yang bisa kita lakukan pada object ReflectionProperty, lebih baik kita buka halaman dokumentasi pada situs php.net. Kita bisa menggunakan link pada slide tadi, atau bisa search google dengan kata kunci php ReflectionClass, lalu kita pilih dari php.net. Di halaman dokumentasi, kita bisa melihat daftar konstanta, property dan method dari kelas ReflectionClass.

Kalau kita scroll ke bawah, kita bisa melihat penjelasan dari masing-masing method. Berhubung teman-teman sudah belajar banyak mengenai OOP di PHP, disini kita akan membaca kembali istilah-istilah yang telah kita pelajari dari video sebelumnya. Saya harap teman-teman masih ingat pelajaran sebelumnya ya. Jadi teman-teman tidak akan kesulitan untuk mempelajari dokumentasi ini.

Yang perlu kita lihat adalah kelas ReflectionProperty. Lihat ke sidebar di sebelah kanan. Disini ada daftar kelas yang berhubungan dengan Reflection. Kita klik ke kelas ReflectionProperty. Kita mendapatkan halaman dokumentasi yang mirip dengan sebelumnya. Jadi di bagian awal kita mendapatkan daftar konstanta, property dan method milik ReflectionProperty. Kemudian kalau kita scroll ke bawah, ada penjelasan singkat mengenai kegunaan dari method-method yang ada. Sekali lagi disini banyak istilah-istilah yang sudah pernah kita bahas dalam Object Oriented Programming ya.

Sebagai contoh, kelas Student kita memiliki 2 buah property public dan property terakhir age bersifat private. Disini ada method untuk memeriksa visibility dari property, yaitu isPublic, isPrivate dan isProtected. Kita coba ya.

Setelah kita menyebutkan nama property, kita tambahkan string spasi. Kemudian kita panggil method-nya $property->isPublic(). Maka kita mendapatkan hasil name 1, classroom 1 dan age. Name dan Classroom mendapatkan angka 1 karena bersifat public. Sedangkan age tidak mendapatkan angka 1 karena bukan public.

Kalau kita ganti nama method-nya menjadi isPrivate, maka yang terjadi adalah kebalikannya. Yang mendapatkan angka 1 hanyalah age.

Nah, bagi teman-teman yang kurang nyaman dengan cara menulis kode seperti ini. Karena ada resiko terjadinya kesalahan typo akibat kurang tanda titik. Ada cara alternatif untuk menuliskan kodenya, yaitu menggunakan string yang menggunakan tanda petik ganda. Kodenya menjadi seperti ini:

echo "{$property->name} {$property->isPrivate()}\n";

Kita menggunakan tanda kurung kurawal untuk memanggil property atau method dari object. Ini adalah cara menulis alternatifnya, dimana kita tidak perlu melakukan penggabungan string menggunakan tanda titik.

Kita lihat lagi dokumentasi ReflectionProperty. Pada bagian paling atas terdapat 5 buah konstanta, yaitu IS_STATIC, IS_READONLY, IS_PUBLIC, IS_PROTECTED dan IS_PRIVATE. Kegunaan dari konstanta ini adalah untuk menjadi filter pada saat kita memanggil method getProperties.

Sebagai contoh, kita hendak memilih hanya property yang bersifat public saja. Kita kembali ke kode getProperties. Disini kita tambahkan argument ReflectionProperty::IS_PUBLIC. Kalau kita jalankan, maka kita hanya mendapatkan name dan classroom saja.

Kalau kita ganti argument-nya menjadi IS_PRIVATE. Maka kita hanya mendapatkan property yang bersifat private saja, yaitu age. Jadi konstanta ini bisa kita gunakan untuk mencari property yang sesuai dengan nama konstanta.

Bagaimana kalau kita ingin memunculkan keduanya sekaligus? Baik yang public maupun yang private? Nah, disini kita bisa menggunakan tanda pipe atau operator bitwise or. Argument-nya menjadi ReflectionProperty::IS_PRIVATE | ReflectionProperty::IS_PUBLIC. Maka PHP mengambil semua property yang bersifat public atau bersifat private. Kita mendapatkan hasil ketiga property-nya.

Kita masuk ke soal latihan. Tadi kita sudah berhasil mengambil ketiga nama property dari kelas Student. Selanjutnya kita ingin menampilkan daftar nama konstanta dan daftar nama method-nya. Hal ini bisa kita lakukan dengan menggunakan method getContants dan getMethods milik ReflectionClass. Pause terlebih dahulu video ini dan coba kerjakan pada komputer masing-masing. Sebagai pedoman cara menggunakan kedua method, baca dokumentasi resmi pada php.net.

Kita coba kerjakan latihan ya. Kita komentari dahulu kode untuk menampilkan daftar property.

Cara untuk mengerjakan latihan kurang lebih sama seperti cara menampilkan property. Hanya saja kita perlu mengganti kata property menjadi constant atau method. Kita coba yang konstanta terlebih dahulu.

Kita buat variable $constants untuk menyimpan hasil dari method $reflection->getContants(). Kita coba var_dump nilai dari $constants.

Untuk hasil dari getConstants, berbeda dari getProperties. Kalau sebelumnya kita mendapatkan array yang menyimpan data berupa object. Untuk konstanta, kita mendapatkan array yang berbentuk pasangan key value. Dimana key adalah nama konstanta, sedangkan value adalah nilainya. Jadi untuk menampilkan nama konstanta, perintah foreach-nya berubah menjadi $constants as $constantName => $constantValue. Kalau kita ingin menampilkan namanya, maka kita echo $constantName . PHP_EOL. Kita jalankan, dan latihan pertama selesai.

Kita komentari dahulu kodenya. Kita lanjutkan ke latihan kedua yaitu untuk menampilkan daftar method. Pertama kita buat dahulu variable $methods untuk menampung hasil $reflection->getMethods(). Kemudian kita var_dump untuk melihat hasilnya. Hasilnya adalah array dari object RelfectionMethod, dimana yang ingin kita tampilkan adalah property name.

Jadi kita buat perintah foreach($methods as $method). Di dalamnya kita tampilkan $method->name . PHP_EOL. Kita jalankan dan latihan kita pun sudah selesai.

Yang perlu diperhatikan disini adalah ketiga method getProperties, getContants dan getMethods, cara penggunaannya memang mirip, namun bukan berarti sama persis ya. Sebagai contoh tadi getContants bukan mengembalikan array yang berisi object, melainkan mengembalikan array dalam bentuk pasangan key value. Hal-hal seperti ini bisa kita lihat dengan lebih jelas dari halaman dokumentasi. Kita bisa klik ke method getContants. Return value-nya adalah array yang berupa key yang menyimpan nama konstanta, dan value yang menyimpan nilai konstanta.

Sedangkan kalau kita melihat ke method getMethods, hasilnya adalah array yang berupa ReflectionMethod. Dan kalau kita lihat ke dalam kelas ReflectionMethod, hasilnya ada perbedaan dengan ReflectionProperty ya. Disini jumlah konstantanya ada 6. Dan dari nama-nama methodnya disini juga mengandung kata kunci yang lebih khusus untuk method, yang tidak ada pada property.

Jadi kalau teman-teman ingin mempelajari lebih detil mengenai Reflection, bisa mengacu pada dokumentasi resmi. Nantinya teman-teman juga bisa mencoba sendiri cara menggunakan method lainnya. Untuk video kali ini saya akhiri dahulu disini. Sampai bertemu lagi di video berikutnya.

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.