Pemrograman Berorientasi Objek dalam PHP

Kita bisa membayangkan alam semesta kita terbuat dari objek yang berbeda seperti matahari, bumi, bulan dll. Demikian pula kita bisa membayangkan mobil kita terbuat dari objek yang berbeda seperti roda, kemudi, roda gigi, dll. Sama halnya ada konsep pemrograman berorientasi objek yang menganggap segala sesuatu sebagai objek dan menerapkan perangkat lunak menggunakan objek yang berbeda.

Konsep Berorientasi Objek

Sebelum kita membahas secara rinci, mari kita tentukan istilah-istilah penting yang terkait dengan Pemrograman Berorientasi Objek.

  • Class- Ini adalah tipe data yang ditentukan oleh programmer, yang mencakup fungsi lokal serta data lokal. Anda dapat menganggap kelas sebagai template untuk membuat banyak instance dari jenis (atau kelas) objek yang sama.

  • Object- Contoh individu dari struktur data yang ditentukan oleh kelas. Anda mendefinisikan kelas sekali dan kemudian membuat banyak objek miliknya. Objek juga dikenal sebagai instance.

  • Member Variable- Ini adalah variabel yang ditentukan di dalam kelas. Data ini tidak akan terlihat di luar kelas dan dapat diakses melalui fungsi anggota. Variabel-variabel ini disebut atribut objek setelah sebuah objek dibuat.

  • Member function - Ini adalah fungsi yang didefinisikan di dalam kelas dan digunakan untuk mengakses data objek.

  • Inheritance- Ketika kelas didefinisikan dengan mewarisi fungsi yang ada dari kelas induk maka itu disebut pewarisan. Di sini kelas anak akan mewarisi semua atau beberapa fungsi dan variabel anggota dari kelas induk.

  • Parent class- Kelas yang diwarisi dari kelas lain. Ini juga disebut kelas dasar atau kelas super.

  • Child Class- Kelas yang diwarisi dari kelas lain. Ini juga disebut subclass atau kelas turunan.

  • Polymorphism- Ini adalah konsep berorientasi objek di mana fungsi yang sama dapat digunakan untuk tujuan yang berbeda. Misalnya nama fungsi akan tetap sama tetapi menggunakan jumlah argumen yang berbeda dan dapat melakukan tugas yang berbeda.

  • Overloading- jenis polimorfisme di mana beberapa atau semua operator memiliki implementasi yang berbeda tergantung pada jenis argumen mereka. Fungsi yang serupa juga dapat dibebani dengan implementasi yang berbeda.

  • Data Abstraction - Representasi data apa pun di mana detail implementasinya disembunyikan (abstrak).

  • Encapsulation - mengacu pada konsep di mana kita merangkum semua data dan fungsi anggota bersama-sama untuk membentuk suatu objek.

  • Constructor - mengacu pada jenis fungsi khusus yang akan dipanggil secara otomatis setiap kali ada pembentukan objek dari kelas.

  • Destructor - mengacu pada jenis fungsi khusus yang akan dipanggil secara otomatis setiap kali objek dihapus atau keluar dari ruang lingkup.

Mendefinisikan Kelas PHP

Bentuk umum untuk mendefinisikan kelas baru dalam PHP adalah sebagai berikut -

<?php
   class phpClass {
      var $var1;
      var $var2 = "constant string";
      
      function myfunc ($arg1, $arg2) {
         [..]
      }
      [..]
   }
?>

Berikut adalah deskripsi setiap baris -

  • Bentuk khusus class, diikuti dengan nama kelas yang ingin Anda tentukan.

  • Satu set tanda kurung yang menyertakan sejumlah deklarasi variabel dan definisi fungsi.

  • Deklarasi variabel dimulai dengan bentuk khusus var, yang diikuti dengan nama variabel $ konvensional; mereka mungkin juga memiliki tugas awal ke nilai konstan.

  • Definisi fungsi terlihat seperti fungsi PHP yang berdiri sendiri tetapi bersifat lokal untuk kelas dan akan digunakan untuk mengatur dan mengakses data objek.

Contoh

Berikut adalah contoh yang mendefinisikan kelas jenis Buku -

<?php
   class Books {
      /* Member variables */
      var $price;
      var $title;
      
      /* Member functions */
      function setPrice($par){
         $this->price = $par;
      }
      
      function getPrice(){
         echo $this->price ."<br/>";
      }
      
      function setTitle($par){
         $this->title = $par;
      }
      
      function getTitle(){
         echo $this->title ." <br/>";
      }
   }
?>

Variabel $thisadalah variabel khusus dan mengacu pada objek yang sama yaitu. diri.

Membuat Objek di PHP

Setelah Anda mendefinisikan kelas Anda, maka Anda dapat membuat objek sebanyak yang Anda suka dari jenis kelas itu. Berikut contoh cara membuat objek menggunakannew operator.

$physics = new Books;
$maths = new Books;
$chemistry = new Books;

Di sini kita telah membuat tiga objek dan objek-objek ini tidak bergantung satu sama lain dan mereka akan memiliki keberadaannya secara terpisah. Selanjutnya kita akan melihat bagaimana mengakses fungsi anggota dan memproses variabel anggota.

Memanggil Fungsi Anggota

Setelah membuat objek Anda, Anda akan dapat memanggil fungsi anggota yang terkait dengan objek itu. Satu fungsi anggota hanya dapat memproses variabel anggota dari objek terkait.

Contoh berikut menunjukkan cara menyetel judul dan harga untuk tiga buku dengan memanggil fungsi anggota.

$physics->setTitle( "Physics for High School" );
$chemistry->setTitle( "Advanced Chemistry" );
$maths->setTitle( "Algebra" );

$physics->setPrice( 10 );
$chemistry->setPrice( 15 );
$maths->setPrice( 7 );

Sekarang Anda memanggil fungsi anggota lain untuk mendapatkan nilai yang ditetapkan dalam contoh di atas -

$physics->getTitle();
$chemistry->getTitle();
$maths->getTitle();
$physics->getPrice();
$chemistry->getPrice();
$maths->getPrice();

Ini akan menghasilkan hasil sebagai berikut -

Physics for High School
Advanced Chemistry
Algebra
10
15
7

Fungsi Konstruktor

Constructor Functions adalah jenis fungsi khusus yang dipanggil secara otomatis setiap kali sebuah objek dibuat. Jadi kami memanfaatkan sepenuhnya perilaku ini, dengan menginisialisasi banyak hal melalui fungsi konstruktor.

PHP menyediakan fungsi khusus yang disebut __construct()untuk mendefinisikan konstruktor. Anda dapat meneruskan argumen sebanyak yang Anda suka ke dalam fungsi konstruktor.

Contoh berikut akan membuat satu konstruktor untuk kelas Buku dan akan menginisialisasi harga dan judul buku pada saat pembuatan objek.

function __construct( $par1, $par2 ) {
   $this->title = $par1;
   $this->price = $par2;
}

Sekarang kita tidak perlu memanggil fungsi set secara terpisah untuk mengatur harga dan judul. Kita dapat menginisialisasi dua variabel anggota ini hanya pada saat pembuatan objek. Lihat contoh berikut di bawah -

$physics = new Books( "Physics for High School", 10 );
$maths = new Books ( "Advanced Chemistry", 15 );
$chemistry = new Books ("Algebra", 7 );

/* Get those set values */
$physics->getTitle();
$chemistry->getTitle();
$maths->getTitle();

$physics->getPrice();
$chemistry->getPrice();
$maths->getPrice();

Ini akan menghasilkan hasil sebagai berikut -

Physics for High School
  Advanced Chemistry
  Algebra
  10
  15
  7

Penghancur

Seperti fungsi konstruktor, Anda dapat mendefinisikan fungsi destruktor menggunakan fungsi __destruct(). Anda dapat melepaskan semua sumber daya dengan-dalam sebuah destruktor.

Warisan

Definisi kelas PHP secara opsional dapat mewarisi dari definisi kelas induk dengan menggunakan klausa extends. Sintaksnya adalah sebagai berikut -

class Child extends Parent {
   <definition body>
}

Efek pewarisan adalah bahwa kelas anak (atau subkelas atau kelas turunan) memiliki karakteristik berikut -

  • Secara otomatis memiliki semua deklarasi variabel anggota kelas induk.

  • Secara otomatis memiliki semua fungsi anggota yang sama dengan induk, yang (secara default) akan bekerja dengan cara yang sama seperti fungsi tersebut di induk.

Contoh berikut mewarisi kelas Buku dan menambahkan lebih banyak fungsionalitas berdasarkan kebutuhan.

class Novel extends Books {
   var $publisher;
   
   function setPublisher($par){
      $this->publisher = $par;
   }
   
   function getPublisher(){
      echo $this->publisher. "<br />";
   }
}

Sekarang selain dari fungsi yang diwariskan, Novel kelas menyimpan dua fungsi anggota tambahan.

Fungsi Mengganti

Definisi fungsi di kelas anak menggantikan definisi dengan nama yang sama di kelas induk. Di kelas anak, kita dapat mengubah definisi fungsi yang diwarisi dari kelas induk.

Dalam contoh berikut, fungsi getPrice dan getTitle diganti untuk mengembalikan beberapa nilai.

function getPrice() {
   echo $this->price . "<br/>";
   return $this->price;
}
   
function getTitle(){
   echo $this->title . "<br/>";
   return $this->title;
}

Anggota Umum

Kecuali Anda menentukan sebaliknya, properti dan metode kelas bersifat publik. Artinya, mereka dapat diakses dalam tiga kemungkinan situasi -

  • Dari luar kelas yang dideklarasikan

  • Dari dalam kelas tempat ia dideklarasikan

  • Dari dalam kelas lain yang mengimplementasikan kelas tempat ia dideklarasikan

Sampai sekarang kami telah melihat semua anggota sebagai anggota publik. Jika Anda ingin membatasi aksesibilitas anggota kelas maka Anda mendefinisikan anggota kelas sebagaiprivate atau protected.

Anggota pribadi

Dengan menunjuk pribadi anggota, Anda membatasi aksesibilitasnya ke kelas tempat ia dideklarasikan. Anggota pribadi tidak dapat dirujuk dari kelas yang mewarisi kelas yang dideklarasikan dan tidak dapat diakses dari luar kelas.

Seorang anggota kelas dapat dijadikan pribadi dengan menggunakan private kata kunci di depan anggota.

class MyClass {
   private $car = "skoda";
   $driver = "SRK";
   
   function __construct($par) {
      // Statements here run every time
      // an instance of the class
      // is created.
   }
   
   function myPublicFunction() {
      return("I'm visible!");
   }
   
   private function myPrivateFunction() {
      return("I'm  not visible outside!");
   }
}

Ketika kelas MyClass diwarisi oleh kelas lain menggunakan extends, myPublicFunction () akan terlihat, seperti halnya $ driver. Kelas perluasan tidak akan memiliki kesadaran atau akses ke myPrivateFunction dan $ car, karena mereka dinyatakan pribadi.

Anggota yang dilindungi

Properti atau metode yang dilindungi dapat diakses di kelas tempat ia dideklarasikan, serta di kelas yang memperluas kelas itu. Anggota yang dilindungi tidak tersedia di luar kedua jenis kelas tersebut. Seorang anggota kelas dapat dilindungi dengan menggunakanprotected kata kunci di depan anggota.

Ini adalah versi berbeda dari MyClass -

class MyClass {
   protected $car = "skoda";
   $driver = "SRK";

   function __construct($par) {
      // Statements here run every time
      // an instance of the class
      // is created.
   }
   
   function myPublicFunction() {
      return("I'm visible!");
   }
   
   protected function myPrivateFunction() {
      return("I'm  visible in child class!");
   }
}

Antarmuka

Antarmuka didefinisikan untuk memberikan nama fungsi yang umum bagi pelaksana. Pelaksana yang berbeda dapat mengimplementasikan antarmuka tersebut sesuai dengan kebutuhan mereka. Bisa dibilang, interface adalah kerangka yang diimplementasikan oleh developer.

Pada PHP5, dimungkinkan untuk mendefinisikan antarmuka, seperti ini -

interface Mail {
   public function sendMail();
}

Kemudian, jika kelas lain mengimplementasikan antarmuka itu, seperti ini -

class Report implements Mail {
   // sendMail() Definition goes here
}

Konstanta

Konstanta agak mirip dengan variabel, yang memiliki nilai, tetapi sebenarnya lebih seperti fungsi karena konstanta tidak dapat diubah. Setelah Anda mendeklarasikan sebuah konstanta, konstanta tidak akan berubah.

Mendeklarasikan satu konstanta itu mudah, seperti yang dilakukan di versi MyClass -

class MyClass {
   const requiredMargin = 1.7;
   
   function __construct($incomingValue) {
      // Statements here run every time
      // an instance of the class
      // is created.
   }
}

Di kelas ini, requiredMargin adalah sebuah konstanta. Itu dideklarasikan dengan kata kunci const, dan dalam keadaan apa pun tidak dapat diubah menjadi apa pun selain 1.7. Perhatikan bahwa nama konstanta tidak memiliki $ di depannya, seperti halnya nama variabel.

Kelas Abstrak

Kelas abstrak adalah kelas yang tidak bisa dibuat instance-nya, hanya diturunkan. Anda mendeklarasikan kelas abstrak dengan kata kunciabstract, seperti ini -

Saat mewarisi dari kelas abstrak, semua metode bertanda abstrak di deklarasi kelas induk harus ditentukan oleh anak; selain itu, metode ini harus ditentukan dengan visibilitas yang sama.

abstract class MyAbstractClass {
   abstract function myAbstractFunction() {
   }
}

Perhatikan bahwa definisi fungsi di dalam kelas abstrak juga harus diawali dengan kata kunci abstrak. Tidaklah legal untuk memiliki definisi fungsi abstrak di dalam kelas non-abstrak.

Kata Kunci Statis

Mendeklarasikan anggota kelas atau metode sebagai statis membuatnya dapat diakses tanpa memerlukan pembuatan instance kelas. Anggota yang dideklarasikan sebagai statis tidak dapat diakses dengan objek kelas yang dipakai (meskipun metode statis dapat).

Coba contoh berikut -

<?php
   class Foo {
      public static $my_static = 'foo';
      
      public function staticValue() {
         return self::$my_static;
      }
   }
	
   print Foo::$my_static . "\n";
   $foo = new Foo();
   
   print $foo->staticValue() . "\n";
?>

Kata Kunci Akhir

PHP 5 memperkenalkan kata kunci terakhir, yang mencegah kelas anak menimpa metode dengan mengawali definisi dengan final. Jika kelas itu sendiri sedang didefinisikan final maka itu tidak dapat diperpanjang.

Contoh berikut menghasilkan kesalahan Fatal: Tidak dapat mengganti metode akhir BaseClass :: moreTesting ()

<?php

   class BaseClass {
      public function test() {
         echo "BaseClass::test() called<br>";
      }
      
      final public function moreTesting() {
         echo "BaseClass::moreTesting() called<br>";
      }
   }
   
   class ChildClass extends BaseClass {
      public function moreTesting() {
         echo "ChildClass::moreTesting() called<br>";
      }
   }
?>

Memanggil konstruktor induk

Alih-alih menulis konstruktor yang sama sekali baru untuk subkelas, mari kita tulis dengan memanggil konstruktor induknya secara eksplisit dan kemudian melakukan apa pun yang diperlukan sebagai tambahan untuk pembuatan instance subkelas. Inilah contoh sederhana -

class Name {
   var $_firstName;
   var $_lastName;
   
   function Name($first_name, $last_name) {
      $this->_firstName = $first_name;
      $this->_lastName = $last_name;
   }
   
   function toString() {
      return($this->_lastName .", " .$this->_firstName);
   }
}
class NameSub1 extends Name {
   var $_middleInitial;
   
   function NameSub1($first_name, $middle_initial, $last_name) {
      Name::Name($first_name, $last_name);
      $this->_middleInitial = $middle_initial;
   }
   
   function toString() {
      return(Name::toString() . " " . $this->_middleInitial);
   }
}

Dalam contoh ini, kita memiliki kelas induk (Name), yang memiliki konstruktor dua argumen, dan subclass (NameSub1), yang memiliki konstruktor tiga argumen. Konstruktor NameSub1 berfungsi dengan memanggil konstruktor induknya secara eksplisit menggunakan sintaks :: (meneruskan dua argumennya) dan kemudian menyetel bidang tambahan. Demikian pula, NameSub1 mendefinisikan fungsi toString () non konstruktornya dalam istilah fungsi induk yang ditimpanya.

NOTE- Sebuah konstruktor dapat didefinisikan dengan nama yang sama dengan nama kelas. Ini didefinisikan dalam contoh di atas.