Cara menggunakan php abstract protected function

Tulisan ini diterjemahkan dari artikel yang berjudul “Class Abstraction in PHP” oleh Dave Smith [phpclasses.org], dengan seijin dari penulis.

Ketika anda sudah siap untuk berbagi kode anda untuk digunakan oleh developer lain, anda akan perlu mengontrol bagaimana kode itu digunakan dan memberikan cara agar bisa dikembangkan.
Dalam tutorial ini kita akam mempelajari bagaimana cara menggunakan kelas abstraksi dengan object yang berhubungan erat untuk memberikan kontrol yang lebih besar pada kode PHP anda, sehingga dapat memfasilitasi pengembangan di masa yang akan datang.

Pengenalan

Pada tutorial ini saya anggap anda sudah mengetahui dengan baik tentang class inheritance (Pewarisan Kelas), visibility (Visibilitas) and instantiation. Anda bisa melihat artikel sebelumnya. Perlu dicatat bahwa contoh yang ada di dalam tutorial ini masih belum lengkap dan disediakan hanya untuk menggambarkan konsep.

Apakah Kelas Abstraksi itu?

Kelas Abstraksi adalah merupakan suatu cara untuk kelas melakukan pengembangan dari kelas lainnya dalam mengimplementasikan suatu method tertentu. Kelas utama / Parent Class kita sebut “Abstract Class” dan child class kita sebut dengan “concrete class”, dan method dari concrete class yang diimplementasikan disebut “Abstract Methods”.
Untuk diketahui, bahwa Abstrak merupakan konsep secara umum dan concrete merupakan implementasi spesifik dari abstrak.

Beberapa Hal Penting yang perlu diingat

  1. Hal pertama yang perlu diingat adalah bahwa setiap kelas memiliki setidaknya satu abstrak method pada kelas abstrak.
  2. Kedua bahwa kelas abstrak tidak bisa dijalankan, kamu harus menjalankan kelas concerete.
  3. Yang ketiga yang perlu diperhatikan bahwa method abstrak tidak diimplementasikan, namun hanya menyediakan abstrak untuk diimplementasikan oleh kelas concerete.

Contoh berikut menggambarkan bagaimana hal ini bekerja.

Abstraksi Sebagai Template

Jenis pertama dari kelas abstrak kita sebut sebagai template. Template hanya berisi abstract methods. Kelas abstrak sebagai template sangat bermanfaat ketika kamu ingin mengatur sesuatu yang spesifik pada setiap kelas concrete, memastikan keseragaman model.
Berikut adalah sebuah contoh sederhana kelas abstrak sebagai template.

abstract class theBoss {

 abstract protected function showWork($project);

}

Seperti kita lihat, ini adalah sebuah kelas abstrak dengan nama theBoss dan memiliki sebuah method abstrak yaitu showWork. Method showWork memiliki sebuah properti, $project yang kita sebut sebagai method signature.
Anda dapat membacanya sebagai berikut, Saya theBoss dan anda akan menerapkan sebuah method bernama showWork dan method tersebut harus menerima project data. TheBoss tidak peduli bagaimana ini diterapkan, hanya peduli bahwa itu dilaksanakan.
Anda dapat menambahkan banyak method abstrak ke dalam kelas untuk memenuhi kebutuhan. Tapi perlu diingat bahwa mereka tidak dijalankan didalam kelas abstrak, namun hanya menyediakan nama dan method signature untuk diimplementasikan oleh kelas concrete.

Kelas Concrete

Sekarang mari kita kembangkan kelas abstrak theBoss melalui sebuah kelas concrete.

class theEmployee extends theBoss {

 public function showWork( $project = 'Nothing' ) {

  $work = 'I am working on '.$project;

  return $work;

 }

 public function startWork($project) {

  return $this->showWork($project);
          
 }
      
}

Disini kita memiliki kelas theEmployee yang merupakan pengembangan dari kelas theBoss. Kelas ini telah melakukan tugasnya dan menjalankan method showWork dengan method signature yang cocok.
Coba anda lihat kembali pada abstract method dan lihat bahwa visibilitas dalam kondisi protected, selama method implementasi memiliki visibilitas bernilai public. Method implementasi dapat merubah visibilitas selama pembatasannya (restrictive) lebih longgar dari abstract, jadi dalam kasus ini public diperbolehkan sementara private tidak diperbolehkan.
TheEmployee juga menyediakan method sendiri, startWork. Sebuah concrete class dapat menjalankan banyak method yang dibutuhkan as long as it implements the abstract methods it is required to.
Sekarang mari kita kembangkan lagi kelas theEmployee melalui sebuh concrete class.

class theContractor extends theEmployee {

 public function showWork( $project, $employeeName='' ) {

  $work = empty($employeeName) ? 'I am working on ' . $project : $employeeName . ' has me working on '.$project;

  return $work;
        
}

Disini kita memiliki kelas theContractor pengembangan dari kelas theEmployee yang dikembangkan dari kelas theBoss. kelas ini juga telah melaksanakan tugasnya dan menjalankan method showWork dengan ciri yang sama (matching signature).
Tunggu sebentar, pada propertinya juga terdapat $employeeName, jadi apakah method signatures benar benar cocok? Iya tentu, sebuah implemented method bisa mencakup properti tambahan selama properti itu bersifat opsional. $employeeName adalah opsional karena diinisialisasi dengan nilai default, dalam kasus ini adalah string kosong.
Perhatikan juga bahwa kelas theContractor menjalankan method showWork berbeda dengan kelas theEmployee. Sekali lagi, kelas theBoss tidak peduli bagaimana ini diterapkan, pokoknya terimplementasi. Juga perlu dicatat karena inheritance (Pewarisan), kelas theContractor juga memiliki akses ke method startWork dari kelas theEmployee.
Anda dapat menjalankan baik kelas theEmployee ataupun kelas theContractor karena mereka merupakan concrete classes, namun jangan kelas theBoss karena merupakan kelas abstract.

Abstraksi sebagai implementasi parsial

Ini adalah jenis kedua dari kelas abstract yang akan kita sebut sebagai implementasi parsial / partial implementation. Sebuah partial implementation sepenuhnya berisi implemented methods, disebut common methods, bersama dengan abstract methods. Kelas abstract sebagai partial implementation dapat jauh lebih berguna daripada hanya sebagai template.
Ini kelas theBoss lagi sebagai partial implementation.

abstract class theBoss {

 abstract protected function showWork( $project );

 final public function assignWork( $employee, $project) {

  $assigned = $employee . ' will be working on ' . $project;

  return $assigned;

 }
      
}

Bisa anda lihat, theBoss telah diimplementasikan sebagai method biasa (common method), assignWork diwarisi oleh semua kelas concrete. dengan menambahkan kata kunci final pada method sehingga tidak ada kelas concrete yang mengimplementasikannya berbeda.
Lazimnya menggunakan metode umum pada implementasi parsial untuk menyediakan fungsionalitas yang tinggi kepada kelas concrete dalam mengimplementasikan method spesifik dalam memproses data.
Dengan kata lain, kita harus bisa memahami, theBoss bertanggung jawab untuk membuat keputusan penting dan memastikan theEmployee dan theContractor siap untuk menerima instruksi sehingga mereka dapat melakukan pekerjaan tersebut.
Keuntungan lain dari implementasi parsial, anda dapat memperbarui method umum dan update ini otomatis diterapkan untuk semua kelas concrete tanpa harus membuat perubahan pada kelas concrete.
………….

Dapatkah kelas properti menjadi Abstrak?

Jawaban yang sederhana adalah tidak. Tidak perlu untuk kelas properti menjadi abstrak. Properti kelas dan konstanta tidak diimplementasikan, sebaliknya mereka dinyatakan(declare), yang dengan cara itu yang sudah membuat mereka abstrak. Mereka mengikuti aturan yang sama dan diperlakukan dengan cara yang sama ketika diyatakan(deklarasikan) dalam sebuah kelas abstrak.

Kesimpulan

Kelas abstraksi berguna setiap kali Anda ingin menyediakan implementasi umum di objek serupa. Ini adalah roadmap untuk bagaimana benda serupa diciptakan sehingga mereka dapat memanfaatkan setiap metode umum sambil memberikan fleksibilitas untuk menerapkan metode abstrak yang paling sesuai dengan kebutuhan objek.