Class Abstrak
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 25 dari 91.
Abstract class adalah class yang tidak dapat dibuat instance-nya secara langsung. Abstract class berfungsi sebagai cetak biru untuk class lain, dengan mendefinisikan method yang harus diimplementasikan oleh class anak. Kamu membuat abstract class menggunakan kata kunci abstract.
<?php
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}
$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();
output:
15class Shape mendeklarasikan method abstrak calculateArea() tanpa menyediakan implementasi. Setiap class yang mewarisi Shape harus mengimplementasikan method ini. Perhatikan bahwa class abstrak juga dapat memiliki method biasa seperti getColor() yang langsung diwarisi oleh class anak.
Method abstrak menentukan apa yang harus dilakukan class turunan, tetapi bukan bagaimana melakukannya. Ini memastikan semua bentuk memiliki method calculateArea() sekaligus memungkinkan setiap bentuk menghitung luasnya dengan cara yang berbeda.
Poin Utama: Abstract class menggabungkan struktur pewarisan dengan persyaratan yang wajib dipenuhi. Gunakan saat kamu ingin berbagi kode di antara class yang saling terkait sekaligus memastikan setiap class turunan mengimplementasikan method tertentu.
Tantangan
MudahMari kita buat sistem pemutar media yang menunjukkan cara abstract class menerapkan kontrak sekaligus memungkinkan berbagai tipe media menerapkan perilaku pemutarannya sendiri.
Kamu akan mengatur kodemu dalam tiga file:
Media.php: Definisikan abstractMediaclass yang menjadi cetak biru untuk semua tipe media. Class ini harus memiliki property$titledengan akses protected dan constructor yang menerima serta menetapkan title. Sertakan method abstract bernamaplay()yang harus diterapkan oleh child class. Tambahkan juga method biasagetTitle()yang mengembalikan title. Method konkret ini akan diwarisi oleh semua child class.Song.php: DefinisikanSongclass yang mewarisiMedia. Sertakan file Media di bagian atas. Class ini menambahkan property$artist. Constructor harus menerima title dan artist: gunakanparent::__construct()untuk title, lalu tetapkan artist sendiri. Terapkan methodplay()yang diwajibkan agar mengembalikan"Playing song: [title] by [artist]".Podcast.php: DefinisikanPodcastclass yang mewarisiMedia. Sertakan file Media di bagian atas. Class ini menambahkan property$episode(bilangan bulat). Constructor harus menerima title dan nomor episode: gunakanparent::__construct()untuk title, lalu tetapkan episode. Terapkan methodplay()yang diwajibkan agar mengembalikan"Playing podcast: [title] - Episode [episode]".
Di main.php, sertakan file Song dan Podcast. Kamu akan menerima empat input: title lagu, nama artist, title podcast, dan nomor episode (sebagai string yang perlu diubah menjadi bilangan bulat). Buat object Song dan Podcast dengan nilai-nilai ini. Cetak hasil pemanggilan play() pada lagu terlebih dahulu, lalu pada podcast, masing-masing di baris tersendiri.
Tantangan ini menunjukkan cara abstract class menetapkan kontrak: setiap tipe media harus memiliki method play(), tetapi setiap tipe menerapkannya dengan cara berbeda. Abstract Media class tidak dapat dibuat menjadi instance secara langsung, class ini hanya ada untuk menyediakan struktur dan fungsionalitas bersama bagi child class-nya.
Coba sendiri
<?php
require_once 'Song.php';
require_once 'Podcast.php';
// Baca input
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));
// TODO: Buat object Song dengan songTitle dan artistName
// TODO: Buat object Podcast dengan podcastTitle dan episodeNumber
// TODO: Cetak hasil pemanggilan play() pada lagu
// TODO: Cetak hasil pemanggilan play() pada podcast
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online