Tutorial OOP Dasar Pada PHP
Visibility
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 materi ke fitur Visibility. Fitur ini mulai ada di PHP versi 7. Dan dengan menggunakan fitur ini, kita bisa mengatur aksesibiliti dari property, konstanta dan method milik kelas.
Fitur ini sesuai dengan konsep Enkapsulasi dalam Pemograman Berbasis Objek, yaitu kita mengelompokkan data dan function yang berkaitan menjadi sebuah objek. Kemudian kita sembunyikan rincian implementasi di dalam objek tersebut, sehingga pihak luar hanya bisa mengakses data dan metode yang diperlukan saja.
Pada PHP, terdapat 3 level akses visibility, yaitu public, protected dan private. Apabila kita tidak menggunakan kata kunci visibility, maka secara default nilai visibility-nya dianggap sebagai public. Artinya bisa diakses dari mana saja, baik dari dalam kelas maupun dari luar kelas.
Nilai visibility selanjutnya adalah protected, dimana data atau metode hanya bisa diakses dari dalam kelas itu sendiri atau turunan dari kelasnya. Namun tidak bisa diakses dari luar kelas. Sedangkan nilai visibility yang private hanya bisa diakses dari kelas yang bersangkutan.
Ini adalah contoh kode visibility. Kode dari kelas Teacher yang kita pelajari pada video sebelumnya ya. Perhatikan bagian property $name dan $classroom. Kalau sebelumnya kita mendeklarasikan property dengan menggunakan kata kunci var, sekarang diganti menjadi kata kunci visibility, yaitu diantara private, protected atau public. Selanjutnya setiap kali kita hendak membuat method, maka di bagian paling depannya kita sebutkan dahulu nilai visibility dari method tersebut.
Agar lebih jelas, kita coba praktek ya. Kita buka lagi kode kita dari pelajaran sebelumnya. Kita buka file Teacher.php. Disini ada kelas Teacher yang memiliki 2 buah property yaitu $name dan $classroom. Perhatikan cara kita mendeklarasikan property-nya. Kita menggunakan kata kunci var. Berhubung disini tidak ada kata kunci visibility, maka artinya kedua property ini bersifat publik ya. Artinya kedua property bisa diakses dari mana saja, baik dari dalam maupun dari luar kelas.
Sebagai contoh, kita buat lagi file php baru dengan nama visibility.php. Pertama kita buat tag pembuka PHP. Kemudian kita require_once dengan argument 'class/Teacher.php'. Lalu kita coba buat object dari kelas Teacher, dengan argument 'Skysen' dan '1C'. Kita coba panggil method showInformation(). Kita jalankan dari terminal, dan berjalan normal ya.
Berhubung property name dan classroom bisa diakses dari mana saja, artinya kita bisa mengubah nilai property tersebut dari file visibility.php. Misalkan setelah kita membuat object, kita tambahkan dahulu kode untuk mengubah property $name menjadi 'Solution', dan property $classroom menjadi '2A'. Kita jalankan lagi. Dan sekarang nilai $name dan $classroom sudah berubah menjadi 'Solution' dan '2A'.
Kita buka lagi file Teacher.php. Kita ganti kata kunci var menjadi public ya. Kalau kita menggunakan visibility untuk menyebutkan property, maka kita sudah tidak perlu menggunakan var. Kita coba jalankan, dan hasilnya tetap sama ya. Karena secara default nilai visibility adalah public.
Namun perhatikan kalau visibility dari $name kita ganti menjadi private. Artinya property ini sudah tidak bisa diakses dari luar kelas. Kalau kita jalankan, sekarang kita mendapatkan fatal error dengan pesan kesalahan cannot akses private property Teacher::$name. Kode yang error-nya merujuk ke file visibility.php dengan nomor error tepat di kode yang mengakses property $name. Kita komentari kode tersebut dan sekarang kode bisa berjalan tanpa error.
Perhatikan ya, walaupun property tidak bisa diakses dari luar kelas, namun property tetap bisa diakses dari dalam kelas. Kita lihat lagi ke kode kelas Teacher bagian method showInformation. Method ini mengakses nilai dari property $name untuk ditampilkan di terminal. Dan pada terminal kelihatan nilainya adalah 'Skysen'.
Bagaimana dengan kelas anaknya? Kita turun ke kode kelas MathTeacher yang merupakan turunan dari kelas Teacher. Kita coba ganti isi dari method showInformation ya. Sekarang kita coba untuk akses property $name. Kita ganti isi echo menjadi "{$this->name} mengajar pelajaran: {$this->subject}\n". Kita buka lagi visibility.php dan kita ganti kelasnya menjadi MathTeacher dan kita coba jalankan.
Kita mendapatkan warning bahwa property $name tidak ada. Berhubung pesan kesalahannya hanya di tingkat warning, maka kode tetap berjalan ya. Jadi kita masih bisa melihat hasilnya "mengajar pelajaran Math". Namun kita tidak mendapatkan nama gurunya. Kelas MathTeacher dianggap tidak memiliki property $name.
Untuk memperbaiki kesalahan ini, maka kita bisa mengganti visibility-nya menjadi protected. Kita jalankan kembali dan kode berjalan lancar. Karena sekarang semua kelas turunan Teacher sudah bisa mengakses property $name.
Namun yang perlu diperhatikan adalah untuk visibility protected, property $name tetap tidak bisa diakses dari luar kelas. Jadi kalau kode untuk mengubah $name pada visibility.php ini kita aktifkan kembali, maka kita mendapatkan pesan error cannot access protected property $name.
Kalau kita ingin agar property name bisa diakses dari mana saja, maka kita mesti menggunakan public. Jadi property name dapat diakses baik dari dalam kelas itu sendiri, dari kelas turunan, dan dari luar kelas.
Untuk method pada kelas juga perlu kita tambahkan visibility ya. Termasuk contructor-nya. Kita tambahkan kata public sebelum function, agar method bisa diakses dari luar kelas.
Sejak PHP versi 8, terdapat fitur baru dengan nama Constructor Promotion. Dengan menggunakan fitur ini, kita bisa menambahkan kata kunci visibility pada bagian parameter milik constructor, dan sebagai hasilnya PHP secara otomatis mengangkat parameter tersebut sebagai property. Kita sudah tidak perlu menuliskan deklarasi property, dan kita juga tidak perlu menuliskan kode untuk memindahkan nilai parameter ke dalam property.
Ini adalah contoh kodenya ya. Kode kita menjadi lebih ringkas. Pada kelas Teacher sudah tidak ada deklarasi property $name dan $classroom. Lalu di dalam constructor juga sudah tidak perlu menuliskan kode untuk memindahkan nilai dari parameter ke property.
Kita coba praktek ya. Kita buka lagi file Teacher.php dan kita lihat ke kelas Teacher. Perhatikan disini ada 2 property $name dan $classroom dengan tingkat akses public ya. Kedua deklarasi property ini bisa kita hapus. Lalu pada constructor kita tambahkan kata public untuk kedua parameternya. Di dalam constructor, kita sudah tidak perlu menuliskan kode untuk memindahkan nilai parameter ke property. Jadi kedua baris kode ini bisa kita hapus. Kita coba jalankan dan kode berjalan lancar ya. Dan kita sudah menghemat 4 baris kode pada kelas Teacher untuk 2 buah property.
Level akses dari visibility tetap sama dengan yang kita pelajari sebelumnya ya. Kita bisa coba ubah $name menjadi protected, sehingga hanya bisa diakses dari dalam kelas dan turunannya. Kalau kita jalankan maka kita mendapatkan pesan error karena kita mencoba untuk mengakses property dari file visibility.php. Kalau kita komentari kode yang menyebabkan error, maka kode bisa berjalan normal.
Kita lanjutkan materi. Untuk mengimplementasikan konsep enkapsulasi secara penuh, maka semua property mesti diubah menjadi private, sehingga tidak bisa diakses dari luar kelas. Kalau misalkan kita melihat sebuah kapsul, maka kita hanya bisa melihat bagian luar dari kapsul tersebut. Kita tidak bisa melihat isi dari kapsul. Jadi kalau kita terapkan prinsip ini ke OOP, maka semua data hanya bisa diakses dari dalam kelas, tidak bisa diakses dari luar.
Nah, apabila ada kebutuhan untuk mengakses data, maka data harus diakses menggunakan method. Biasanya ada 2 buah method untuk satu property, yaitu method getter untuk mengambil nilai property, dan method setter untuk menyimpan nilai ke property.
Ini adalah penamaan standar yang biasa digunakan untuk getter dan setter. Khusus untuk tipe data boolean, maka nama getter menggunakan prefix is. Sedangkan untuk tipe data lainnya, getter menggunakan prefix get. Kalau untuk method setter, semua tipe data menggunakan prefix set.
Berikutnya adalah contoh kode getter dan setter. Misalkan kita memiliki 2 buah property yaitu $name dengan tipe data string, dan $married dengan tipe data bool. Kode yang kita tulis di sebelah kiri, menggunakan visibility public terhadap kedua property, sehingga property bisa langsung diakses dari luar kelas.
Untuk menerapkan enkapsulasi secara lengkap, semua property harus diubah menjadi private. Untuk mengakses property tersebut, kita harus menggunakan method getter dan setter. Untuk mengakses nilai property $name, kita menggunakan method getName. Sedangkan untuk menyimpan nilai ke property $name, kita menggunakan method setName. Untuk mengakses property $married, kita menggunakan method isMarried. Sedangkan untuk menyimpan nilai ke property $married, kita menggunakan method setMarried.
Apa kelebihan dari menggunakan Getter dan Setter? Yang pertama adalah kita bisa mengatur agar property kita menjadi read only atau write only. Kalau misalkan kita ingin agar property hanya bisa dibaca, maka kita cukup menyediakan getter saja. Kalau misalkan kita ingin agar property hanya bisa ditulis, maka kita cukup menyediakan setter saja.
Kelebihan kedua adalah kita bisa menambahkan kode pada saat membaca atau menulis property. Sebagai contoh, pada saat menulis $name, kita bisa menambahkan kode validasi agar nilai nama tidak boleh kosong.
Disamping kelebihan, tentunya ada kelemahan dari menggunakan Getter dan Setter ya. Kelemahan dari Getter Setter adalah kode yang harus kita tulis menjadi lebih banyak. Secara umum kita harus menambahkan 2 metode untuk setiap properti milik kelas.
Kita coba praktek ya. Kita buka kembali kode kita Teacher.php. Disini kita memiliki 2 buah property ya, yaitu $name dan $classroom. Maka kita mesti membuat getter dan setter untuk masing-masing property.
Pertama kita ubah dahulu akses level pada parameter constructor menjadi private. Kemudian kita buat method baru untuk getter $name. Berhubung tipe datanya string, maka kita menggunakan nama getName dan mengembalikan tipe data string. Isi methodnya cukup mengembalikan nilai dari property $name. Setelah itu kita buat method setName dengan parameter string $value, yang mengembalikan void. Isinya menyimpan $value ke dalam property $name.
Kita lakukan hal yang sama untuk property $classroom. Kita buat method getter. Dan method setter. Nah, kode yang harus kita tulis menjadi lebih banyak ya. Namun cara penulisan kode seperti ini lebih cocok dengan konsep enkapsulasi.
Kalau kita jalankan, ternyata terjadi error ya. Karena property $name sudah tidak bisa diakses di kelas turunan MathTeacher. Sekalian kita ubah kelas MathTeacher dan CodingTeacher. Untuk property $subject kita ubah menjadi private. Sedangkan method-nya public. Kemudian kita tambahkan method getter saja untuk property $subject, karena kita tidak ingin nilai property-nya bisa diubah.
Sedangkan isi method di dalam kelas turunan mesti kita ubah. Kalau kita ingin mengakses nilai property name, maka kita harus menggunakan method getName. Jadi kita ganti ya, yang tadinya $this->name menjadi $this->getName(). Kemudian pada file visibility.php, kita sudah tidak bisa mengakses property secara langsung. Jadi kita komentari saja ya. Kita coba jalankan. Dan kode bisa berjalan dengan benar.
Apa kelebihan dari getter setter? Yang pertama adalah kita bisa menentukan apakah property itu hanya bisa dibaca, atau hanya bisa diubah saja. Sebagai contoh pada kelas turunan seperti MathTeacher, maka nilai dari property $subject hanya bisa dibaca saja. Tidak bisa diubah. Jadi kita hanya membuatkan method getter, tanpa ada setter.
Kelebihan kedua adalah kita bisa menambahkan kode pada saat hendak melakukan get atau set. Sebagai contoh, pada saat mengubah property $name, kita bisa tambahkan kode validasi agar nama tidak boleh kosong.
Kita lihat kembali method setName. Kita tambahkan pengecekan dengan menggunakan if(trim($value) != ''). Jadi kalau nilai dari $value bukan string kosong, barulah kita melakukan pemindahan nilai dari $value ke property $name.
Kita buka kembali file visibility.php. Disini kita bisa mengubah nilai pada property $name dan $classroom namun sudah tidak bisa dengan cara mengakses langsung ke property-nya. Kita harus mengakses melalui method setter. Kita ambil contoh kita ubah $name-nya. Misalkan kita panggil method $teacher->setName('Solution');. Kalau kita jalankan maka kode berjalan tanpa error. Dan nama berubah menjadi 'Solution'. Selanjutnya kita coba untuk mengubah nama menjadi string kosong. Maka nama tidak diubah.
Begitu juga kalau kita coba untuk mengubah nama menjadi string yang isinya banyak spasi. Nama tetap tidak berubah karena kita telah menambahkan kode validasi.
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.