Rabu, 02 Januari 2019

Modul 2 PBO


Pengertian Enkapsulasi (Encapsulation)
Enkapsulasi (encapsulation) adalah sebuah metoda untuk mengatur struktur class dengan cara menyembunyikan alur kerja dari class tersebut.

Struktur class yang dimaksud adalah property dan method. Dengan enkapsulasi, kita bisa membuat pembatasan akses kepada property dan method, sehingga hanya property dan method tertentu saja yang bisa diakses dari luar class. Enkapsulasi juga dikenal dengan istilah ‘information hiding’.
Dengan enkapsulasi, kita bisa memilih property dan method apa saja yang boleh diakses, dan mana yang tidak boleh diakses. Dengan menghalangi kode program lain untuk mengubah property tertentu, class menjadi lebih terintegrasi, dan menghindari kesalahan ketika seseorang ‘mencoba’ mengubahnya. Programmer yang merancang class bisa menyediakan property dan method khusus yang memang ditujukan untuk diakses dari luar.

Melanjutkan analogi tentang class laptop, perusahaan pembuat laptop telah menyediakan ‘method’ khusus untuk menghidupkan laptop, yakni dengan cara menekan tombol on. Di dalam laptop sendiri, banyak ‘method-method’ lain yang akan dijalankan ketika kita menyalakan laptop, contohnya: mengirim sinyal booting ke processor, mengirim data dari processor ke memory, dan mengirim sinyal listrik ke LED di monitor. Akan tetapi, proses ini adalah method internal laptop dimana kita tidak perlu memahaminya untuk menghidupkan laptop.

Enkapsulasi Objek: Public, Protected dan Private
Untuk membatasi hak akses kepada property dan method di dalam sebuah class, Objek Oriented Programming menyediakan 3 kata kunci, yakni Public, Protected dan Private. Kata kunci ini diletakkan sebelum nama property atau sebelum nama method. Berikut adalah pembahasannya:

Pengertian Hak Akses: Public
Ketika sebuah property atau method dinyatakan sebagai public, maka seluruh kode program di luar class bisa mengaksesnya, termasuk class turunan. Berikut adalah contoh penulisan public property dan public method dalam PHP:

<?php
// buat class laptop
class laptop {
   // buat public property
   public $pemilik;
   // buat public method
   public function hidupkan_laptop() {
     return "Hidupkan Laptop";
   }
}
 
// buat objek dari class laptop (instansiasi)
$laptop_anto = new laptop();
 
// set property
$laptop_anto->pemilik="Anto";
 
// tampilkan property
echo $laptop_anto->pemilik; // Anto
 
// tampilkan method
echo $laptop_anto->hidupkan_laptop(); // "Hidupkan Laptop"
?>
Perhatikan penambahan kata public sebelum nama property dan nama method. Kode diatas pada dasarnya sama dengan contoh class laptop kita dalam tutorial sebelum ini.
Jika hak akses property dan method tidak ditulis, maka PHP menganggapnya sebagai public.

Dalam contoh sebelumnya, saya membuat property class laptop menggunakan kata kunci var, seperti berikut ini: 
var $pemilik;
Kata kunci var sebenarnya tidak perlu ditulis, bahkan pada PHP versi 5.0 sampai dengan 5.1.3, menggunakan kata var di dalam class akan menghasilkan warning. Untuk PHP versi 5.1.3 keatas, menggunakan kata var tidak lagi menghasilkan warning (dianggap sebagai public).

Agar sejalan dengan konsep enkapsulasi, setiap property dan method dalam class harus menggunakan kata kunci seperti public, protected, atau private. Oleh karena itu, membuat property dengan keyword var tidak disarankan lagi .
Pengertian Hak Akses: Protected
Jika sebuah property atau method dinyatakan sebagai protected, berarti property atau method tersebut tidak bisa diakses dari luar class, namun bisa diakses oleh class itu sendiri atau turunan class tersebut.
Apabila kita mencoba mengakses protected property atau protected method dari luar class, akan menghasilkan error, seperti contoh berikut ini:

<?php
// buat class laptop
class laptop {
   // buat protected property
   protected $pemilik;
 
  // buat protected method
   protected function hidupkan_laptop() {
      return "Hidupkan Laptop";
   }
}
// buat objek dari class laptop (instansiasi)
$laptop_anto = new laptop();
 
// set protected property akan menghasilkan error
$laptop_anto->pemilik="Anto";
// Fatal error: Cannot access protected property laptop::$pemilik
 
// tampilkan protected property akan menghasilkan error
echo $laptop_anto->pemilik;
// Fatal error: Cannot access protected property laptop::$pemilik
 
// jalankan protected method akan menghasilkan error
echo $laptop_anto->hidupkan_laptop();
// Fatal error: Call to protected method laptop::hidupkan_laptop()
// from context
?>
Dalam contoh diatas, pemanggilan property $pemilik dan method hidupkan_laptop() dari luar class akan menghasilkan error.
Walaupun akses level protected tidak bisa diakses dari luar class, namun bisa diakses dari dalam class itu sendiri, berikut adalah contohnya:

<?php
// buat class laptop
class laptop {
   // buat protected property
   protected $pemilik="Anto";
   public function akses_pemilik() {
      return $this->pemilik;
   }
   protected function hidupkan_laptop() {
      return "Hidupkan Laptop";
   }
   public function paksa_hidup() {
      return $this->hidupkan_laptop();
   }
}
 
// buat objek dari class laptop (instansiasi)
$laptop_anto = new laptop();
 
// jalankan method akses_pemilik()
echo $laptop_anto->akses_pemilik(); // "Anto"
 
// jalankan method paksa_hidup()
echo $laptop_anto->paksa_hidup(); // "Hidupkan Laptop"
?>
Hampir sama dengan contoh kita sebelumnya, property $pemilik di deklarasikan sebagai protected, sehingga pengaksesan dari luar class akan menghasilkan error. Oleh karena itu, saya membuat sebuah public method yang akan menampilkan hasil property $pemilik, yakni method akses_pemilik().
Begitu juga dengan method hidupkan_laptop() yang tidak bisa diakses secara langsung. Saya menambahkan method paksa_hidup() yang secara internal akan mengakses method hidupkan_laptop().

Kata kunci $this merujuk kepada objek saat ini, penjelasan tentang kata kunci $this akan kita bahas dalam tutorial berikutnya. Namun karena satu-satunya cara pengaksesan ‘isi’ class dari dalam class adalah dengan $this, jika anda tidak memahaminya silahkan lewatkan saja terlebih dahulu.
Selain dari dalam class itu sendiri, property dan method dengan hak akses protected juga bisa diakses dari class turunan (Kita akan membahas tentang penurunan class dalam tutorial lain):

<?php
// buat class komputer
class komputer{
   // property dengan hak akses protected
   protected $jenis_processor = "Intel Core i7-4790 3.6Ghz";
}
 
// buat class laptop
class laptop extends komputer{
   public function tampilkan_processor() {
     return $this->jenis_processor;
   }
}
 
// buat objek dari class laptop (instansiasi)
$laptop_baru = new laptop();
 
// jalankan method
echo $laptop_baru->tampilkan_processor(); // "Intel Core i7-4790 3.6Ghz"
?>
Pada kode diatas, walaupun method $jenis_processor di set sebagai protected pada class komputer, tetapi masih bisa diakses dari class laptop yang merupakan turunan dari class komputer.
Pengertian Hak Akses: Private

Hak akses terakhir dalam konsep enkapsulasi adalah private. Jika sebuah property atau method di-set sebagai private, maka satu-satunya yang bisa mengakses adalah class itu sendiri. Class lain tidak bisa mengaksesnya, termasuk class turunan.
Sebagai contoh, berikut adalah hasil yang di dapat jika kita mengakses property dan method dengan level private:

<?php
// buat class komputer
class komputer {
 
   // property dengan hak akses protected
   private $jenis_processor = "Intel Core i7-4790 3.6Ghz";
 
   public function tampilkan_processor() {
     return $this->jenis_processor;
   }
}
 
// buat class laptop
class laptop extends komputer{
 
   public function tampilkan_processor() {
     return $this->jenis_processor;
   }
}
 
// buat objek dari class laptop (instansiasi)
$komputer_baru = new komputer();
$laptop_baru = new laptop();
 
// jalankan method dari class komputer
echo $komputer_baru->tampilkan_processor(); // "Intel Core i7-4790 3.6Ghz"
 
// jalankan method dari class laptop (error)
echo $laptop_baru->tampilkan_processor();
// Notice: Undefined property: laptop::$jenis_processor
?>
Dalam kode diatas, saya membuat 2 buah class, yakni class komputer, dan class laptop. Class laptop merupakan turunan dari class komputer. Di dalam class komputer terdapat property $jenis_processor dengan akses level private. Di dalam class komputer dan class laptop, saya membuat method tampilkan_processor() yang digunakan untuk mengakses property $jenis_processor.

Pengaksesan method tampilkan_processor() dari objek $komputer_baru sukse ditampilkan karena berada di dalam satu class dimana property $jenis_processor beradaAkan tetapi, jika method tampilkan_processor() diakses dari objek $laptop_baru yang merupakan turunan dari class komputer, PHP akan mengeluarkan error karena property $jenis_processor tidak dikenal.
Akses level private sering digunakan untuk menyembunyikan property dan method agar tidak bisa diakses di luar class.

Dalam tutorial kali ini, kita telah membahas tentang pengertian enkapsulasi dalam objek oriented programming (OOP), mengenal 3 hak akses: public, protected, dan private, serta melihat contoh cara penggunaannya di dalam PHP.

Modul 1 PBO (OOP) Object Oriented Programming

Saya disini akan menjelaskan tentang bagaimana penggunaan Program Berbasis Objek modul 1 yaitu OOP atau Object Oriented Programming .. langsung saja kita Mulai.

1. Pengerian OOP
apa itu OOP?

OOP singkatan dari Object Oriented Programming sekarang OOP sangat begitu popular, dan banyak digunakan oleh Programer-Programer, Buktinya CMS,Joomla,Wordpress,Drupal dan banyak lagi, semua itu dibuat dengan gaya pemrograman OOP, Apalagi saat ini sangat trend penggunaan Framwork PHP, seperti Zend PHP, CodeIgniter,Yii Framwork, Cake PHP, yang notabenenya semua juga menggunakan dengan teknik OOP.
Memang Gaya Pemrograman OOP masih menjadi hal menakutkan bagi Programer pemula, Terutama yang terbiasa dengan gaya prosedural. Tetapi hilangkanlah Perasaan yang seperti itu, Jika memang ingin berusaha berkeras hati untuk mempelajarinya.
Tentang OOP di php, tentunya dengan bertahap, dari mulai membuat Class, Membuat Propertise atau atribut, membuat Method/fungsi, membuat object, lalu ada juga Constructor dan Destructor Nanti akan berlanjut dengan Mempelajari Encapsulasi, Inheritance, sampai dengan Mempelajari Polymorphism.

2. Kelebihan dan Kekurangan OOP
  A.Kelebihan
     OOP menyediakan struktur modular yang jelas untuk program sehingga OOP sangat bagus digunakan     untuk  mendefinisikan tipe data abstrak di mana detil implementasinya tersembunyi.
OOP akan mempermudah dalam memaintain dan memodifikasi kode yang sudah ada. Objek yang baru dapat dibuat tanpa mengubah kode yang sudah ada.
B.Kekurangan
1.Tidak memperbolehkan implementasi yang kuat pada reuse
Properti software
2.tidak terikat dalam satu unit fungsional, sehingga harus
crosscut di antara komponennya.
3.Crosscut tersebut mengakibatkan sulitnya pengembangan dan pemeliharaan.

3. Subjek OOP
Class
Class adalah
Class adalah ‘cetak biru’ atau ‘blueprint’ dari object. Class digunakan hanya untuk membuat kerangka dasar. Yang akan kita pakai nantinya adalah hasil cetakan dari class, yakni object.
Sebagai analogi, class bisa diibaratkan dengan laptop atau notebook. Kita tahu bahwa laptop memiliki ciri-ciri seperti merk, memiliki keyboard, memiliki processor, dan beberapa ciri khas lain yang menyatakan sebuah benda tersebut adalah laptop. Selain memiliki ciri-ciri, sebuah laptop juga bisa dikenakan tindakan, seperti: menghidupkan laptop atau mematikan laptop.
Class dalam analogi ini adalah gambaran umum tentang sebuah benda. Di dalam pemrograman nantinya, contoh class seperti: koneksi_database dan profile_user.
Di dalam PHP, penulisan class diawali dengan keyword class, kemudian diikuti dengan nama dari class. Aturan penulisan nama class sama seperti aturan penulisan variabel dalam PHP, yakni diawali dengan huruf atau underscore untuk karakter pertama, kemudian boleh diikuti dengan huruf, underscore atau angka untuk karakter kedua dan selanjutnya. Isi dari class berada dalam tanda kurung kurawal.
Berikut adalah contoh penulisan class dalam PHP:


<?php
class laptop {
   // isi dari class laptop...
}
?>
Property
Property (atau disebut juga dengan atribut) adalah data yang terdapat dalam sebuah class. Melanjutkan analogi tentang laptop, property dari laptop bisa berupa merk, warna, jenis processor, ukuran layar, dan lain-lain
Jika anda sudah terbiasa dengan program PHP, property ini sebenarnya hanyalah variabel yang terletak di dalam class. Seluruh aturan dan tipe data yang biasa diinput kedalam variabel, bisa juga diinput kedalam property. Aturan tata cara penamaan property sama dengan aturan penamaan variabel.

Berikut adalah contoh penulisan class dengan penambahan property:

<?php
class laptop {
   var $pemilik;
   var $merk;
   var $ukuran_layar;
   // lanjutan isi dari class laptop...
}
?>
Dari contoh diatas, $merk, $ukuran_layar dan $jenis_processor adalah property dari class laptop. Seperti yang kita lihat, penulisan property di dalam PHP sama dengan cara penulisan variabel, yakni menggunakan tanda dollar ($). Sebuah class tidak harus memiliki property.
Method

Method adalah tindakan yang bisa dilakukan didalam class. Jika menggunakan analogi class laptop kita, maka contoh method adalah: menghidupkan laptop, mematikan laptop, mengganti cover laptop, dan berbagai tindakan lain.
Method pada dasarnya adalah function yang berada di dalam class. Seluruh fungsi dan sifat function bisa diterapkan kedalam method, seperti argumen/parameter, mengembalikan nilai (dengan keyword return), dan lain-lain.
Berikut adalah contoh penulisan class dengan penambahan method:

<?php
class laptop {
   function hidupkan_laptop() {
   //... isi dari method hidupkan_laptop
   }
   function matikan_laptop() {
   //... isi dari method matikan_laptop
   }
   ... //isi dari class laptop
}
?>
Dari contoh diatas, function hidupkan_laptop() dan function matikan_laptop() adalah method dari class laptop. Seperti yang kita lihat, bahwa penulisan method di dalam PHP sama dengan cara penulisan function. Sebuah class tidak harus memiliki method.
 Object
Object
Object atau Objek adalah hasil cetak dari class, atau hasil ‘konkrit’ dari class. Jika menggunakan analogi class laptop, maka objek dari class laptop bisa berupa: laptop_andi, laptop_anto, laptop_duniailkom, dan lain-lain. Objek dari class laptop akan memiliki seluruh ciri-ciri laptop, yaitu property dan method-nya.
Proses ‘mencetak’ objek dari class ini disebut dengan ‘instansiasi’ (atau instantiation dalam bahasa inggris). Pada PHP, proses instansiasi dilakukan dengan menggunakan keyword ‘new’. Hasil cetakan class akan disimpan dalam variabel untuk selanjutnya digunakan dalam proses program.
 Sebagai contoh, berikut adalah cara membuat objek laptop_andi dan laptop_anto yang dibuat dari class laptop:

<?php
class laptop {
   //... isi dari class laptop
   }
$laptop_andi = new laptop();
$laptop_anto = new laptop();
?>
Dari contoh diatas, $laptop_andi dan $laptop_anto merupakan objek dari class laptop. Kedua objek ini akan memiliki seluruh property dan method yang telah dirancang dari class laptop.


Destructor dan Contructor
Destructor adalah kebalikan dari pada constructor, Destructor dibuat serta digunakan saat object akan dihapus. Pada Pemrogaraman PHP, Destructor akan otomatis dipanggil pada saat akhir pengerjaan skript PHP anda.
Cara Penggunaan Destructor dan Constructor dalam PHP
Sebagai tutorial kita kali ini, berikut adalah contoh penggunaan constructor dan destructor dalam PHP:

<?php
// buat class laptop
class laptop {

   private $pemilik = "Andi";   private $merk = "Lenovo";
 
   public function __construct(){
     echo "Ini berasal dari Constructor Laptop";
   }

   public function hidupkan_laptop(){
     return "Hidupkan Laptop $this->merk punya $this->pemilik";

   }
   public function __destruct(){
     echo "Ini berasal dari Destructor Laptop";
   }
}

// buat objek dari class laptop (instansiasi)
$laptop_andi= new laptop();

echo "<br />";
echo $laptop_andi->hidupkan_laptop();
echo "<br />";
?>
Dalam contoh diatas, saya membuat class laptop dengan 3 method:
Method __construct() merupakan constructor dari class laptop. Method ini akan dipanggil secara otomatis ketika class laptop di instansiasi.
Method hidupkan_laptop() merupakan method ‘biasa’ yang akan menampilkan hasil string. Untuk menggunakan method ini, kita memanggilnya dari objek.
Method ketiga adalah __destruct() yang merupakan destructor dari class laptop. Method ini akan dipanggil saat objek dihapus.
Setelah pendefinisian class, saya membuat objek $laptop_andi, dan memanggil method hidupkan_laptop(). Berikut adalah hasil yang didapat:

1.Ini berasal dari Constructor Laptop
2.Hidupkan Laptop Lenovo punya
3.Ini berasal dari destructor Laptop
Seperti yang terlihat, method __construct() dan __destruct() secara otomatis dipanggil saat objek dibuat dan saat objek dihapus. Untuk mencoba menghapus objek $laptop_andi secara manual, kita bisa menggunakan fungsi unset() sebagai berikut:

<?php
// buat class laptop
class laptop {

   private $pemilik = "Andi";
   private $merk = "Lenovo";
 
   public function __construct(){
     echo "Ini berasal dari Constructor Laptop";
   }

   public function hidupkan_laptop(){
     return "Hidupkan Laptop $this->merk punya $this->pemilik";

   }
   public function __destruct(){
     echo "Ini berasal dari Destructor Laptop";
   }
}

// buat objek dari class laptop (instansiasi)
$laptop_andi= new laptop();

echo "<br />";
echo $laptop_andi->hidupkan_laptop();
echo "<br />";

// hapus objek $laptop_andi
unset($laptop_andi);

echo "<br />";
echo "Objek Telah Dihancurkan";
?>
Jika kita menjalankan kode diatas, berikut adalah hasil yang didapat:

1.Ini berasal dari Constructor Laptop
2.Hidupkan Laptop Lenovo punya Andi
3.Ini berasal dari Destructor Laptop
4.Objek Telah Dihancurkan
Setelah memanggil method $laptop_andi->hidupkan_laptop(), saya kemudian menghapus objek $laptop_andi secara manual menggunakan fungsi unset($laptop_andi)
Untuk membuktikan bahwa destructor $laptop_andi sudah dijalankan, saya menambahkan perintah echo “Objek Telah Dihancurkan” diakhir halaman. Sehingga kita bisa melihat bahwa destructor objek $laptop andi di jalankan sebelum dihapus otomatis oleh PHP. Silahkan anda coba hapus perintah unset($laptop_andi), maka string “Objek Telah Dihancurkan” akan tampil sebelum destructor objek $laptop_andi.

Anda juga bisa mengganti perintah unset($laptop_andi) dengan $laptop_andi=null. Kedua perintah ini akan menghapus objek $laptop_andi dan men-trigger pemanggilan destructor.
Sebagai contoh terakhir dalam tutorial kali ini, saya akan membuat contoh constructor yang sering digunakan untuk membuat objek dengan nilai awal. Konsep ini sering digunakan dalam pemrograman objek. Berikut adalah contoh penggunaannya:

<?php
// buat class laptop
class laptop {

   private $pemilik;
   private $merk;

   // constructor sebagai pembuat nilai awal
   public function __construct($pemilik, $merk) {
     $this->pemilik = $pemilik;
     $this->merk = $merk;
   }

   public function hidupkan_laptop() {
     return "Hidupkan Laptop $this->merk punya $this->pemilik";
   }
}

// buat objek dari class laptop (instansiasi)
$laptop_andi= new laptop("Andi", "Lenovo");

echo $laptop_andi->hidupkan_laptop();
echo "<br />";

$laptop_anto= new laptop("Anto", "Acer");

echo $laptop_anto->hidupkan_laptop();
?>
Pada kode diatas, saya menggunakan constructor sebagai pembuat nilai awal dari objek. Method constructor menerima 2 buah argumen yang kemudian disimpan kedalam property internal objek.
Berikut adalah hasil yang didapat dari kode program diatas:

1.Laptop Lenovo punya Andi
2.Hidupkan Laptop Acer punya Anto

Di dalam PHP, constructor dan destructor harus memiliki hak akses public. Jika anda mengubah hak akses constructor atau destructor menjadi protected atau private, PHP akan mengeluarkan error:

1.Fatal error: Call to private laptop::__construct()
2.from invalid context