7. ABSTRACT METHODS

Abstract Methods dalam PHP adalah method yang dideklarasikan tanpa implementasi di dalam class induk. Method semacam ini harus diimplementasikan oleh class turunannya. Jika sebuah class memiliki satu atau lebih abstract method, maka class tersebut juga harus dideklarasikan sebagai abstract class. Abstract class tidak dapat langsung diinstansiasi sebagai objek, melainkan hanya dapat diwarisi oleh class lain yang kemudian mengimplementasikan abstract method yang telah didefinisikan.

Sintaks Abstract Class dan Abstract Method dalam PHP

Deklarasi abstract class dan abstract method dalam PHP menggunakan kata kunci abstract, baik untuk class maupun method-nya:

abstract class Komponen {
    abstract function tampilkanOutput();
}

Class yang mewarisi Komponen harus mengimplementasikan method tampilkanOutput():

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
class Komponen {
    public function tampilkanOutput() {
        echo "Menampilkan sesuatu...";
    }
}

class GambarKomponen extends Komponen {
    function tampilkanOutput() {
        echo "Menampilkan gambar yang indah.";
    }
}

// Penggunaan
$obj = new GambarKomponen();
$obj->tampilkanOutput(); 
?>

Kode di atas mendefinisikan sebuah class bernama GambarKomponen yang merupakan turunan dari class induk Komponen melalui pewarisan (inheritance). Di dalamnya terdapat method tampilkanOutput() yang didefinisikan untuk menampilkan teks "Menampilkan gambar yang indah.". Ini menunjukkan bahwa class turunan dapat memiliki implementasi method sendiri, baik untuk menggantikan atau melengkapi fungsionalitas yang diwarisi dari class induknya.

Contoh Implementasi Abstract Class dan Abstract Method

Berikut adalah contoh implementasi abstract class dalam skenario kendaraan:

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
abstract class Kendaraan {
    protected $merk;
    protected $kecepatanMaksimal;

    public function __construct($merk, $kecepatanMaksimal) {
        $this->merk = $merk;
        $this->kecepatanMaksimal = $kecepatanMaksimal;
    }

    abstract public function deskripsi();
}

class Mobil extends Kendaraan {
    private $jumlahPintu;

    public function __construct($merk, $kecepatanMaksimal, $jumlahPintu) {
        parent::__construct($merk, $kecepatanMaksimal);
        $this->jumlahPintu = $jumlahPintu;
    }

    public function deskripsi() {
        return "Mobil merk {$this->merk} memiliki kecepatan maksimal {$this->kecepatanMaksimal} km/jam dan {$this->jumlahPintu} pintu.";
    }
}

class Motor extends Kendaraan {
    private $jenis;

    public function __construct($merk, $kecepatanMaksimal, $jenis) {
        parent::__construct($merk, $kecepatanMaksimal);
        $this->jenis = $jenis;
    }

    public function deskripsi() {
        return "Motor merk {$this->merk} berjenis {$this->jenis} dengan kecepatan maksimal {$this->kecepatanMaksimal} km/jam.";
    }
}

// Penggunaan
$mobil = new Mobil("Toyota", 200, 4);
$motor = new Motor("Honda", 150, "Sport");

echo $mobil->deskripsi() . PHP_EOL;
echo $motor->deskripsi() . PHP_EOL;
?>

Kode di atas mendemonstrasikan penggunaan class abstrak Kendaraan yang mendefinisikan struktur dasar dengan properti umum seperti $merk dan $kecepatanMaksimal, serta method abstrak deskripsi() yang wajib diimplementasikan oleh class turunannya. Class Mobil dan Motor merupakan turunan dari Kendaraan yang masing-masing menambahkan properti khusus, yaitu $jumlahPintu pada Mobil dan $jenis pada Motor, serta mengimplementasikan method deskripsi() sesuai karakteristiknya. Penggunaan parent::__construct() dalam konstruktor masing-masing turunan menunjukkan pemanfaatan pewarisan konstruktor dari class induk. Ketika objek Mobil dan Motor dibuat dan method deskripsi() dipanggil, masing-masing akan mengembalikan informasi spesifik sesuai atribut yang dimilikinya.

Abstract Method dalam Traits

Selain di dalam class, abstract method juga dapat didefinisikan dalam trait. Class yang menggunakan trait yang mengandung abstract method wajib mengimplementasikan method tersebut. Berikut contoh penggunaannya:

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
trait BisaDikendarai {
    abstract function getIdentitas();

    public function bandingkanKecepatan($object) {
        return ($object->getIdentitas() < $this->getIdentitas()) ? -1 : 1;
    }
}

class Sepeda {
    use BisaDikendarai;
    private $id;

    public function __construct($id) {
        $this->id = $id;
    }

    public function getIdentitas() {
        return "Sepeda-{$this->id}";
    }
}

// Kesalahan: Class tidak mengimplementasikan method abstract
class Bus {
    use BisaDikendarai;
}

$sepeda = new Sepeda(101);
$bus = new Bus(); // Akan menyebabkan error karena `Bus` tidak mengimplementasikan `getIdentitas()`

$hasilPerbandingan = $sepeda->bandingkanKecepatan($bus);
?>

Trait BisaDikendarai mendeklarasikan abstract method getIdentitas(). Class Sepeda menggunakan trait ini dan mengimplementasikan method getIdentitas() sesuai kontrak. Namun, class Bus juga menggunakan trait tetapi tidak mengimplementasikan getIdentitas(), sehingga akan menyebabkan error. Hal ini menegaskan bahwa setiap class yang menggunakan trait dengan method abstract wajib mendefinisikan method tersebut secara eksplisit.

Ketika Anda mengimplementasikan metode abstrak dalam kelas turunan, tanda tangan metode harus sesuaiโ€”artinya, metode tersebut harus menerima jumlah parameter yang sama. Jika ada petunjuk tipe pada parameter, maka petunjuk tersebut juga harus cocok. Selain itu, metode yang diimplementasikan harus memiliki tingkat visibilitas yang sama atau lebih longgar.

LATIHAN

Susunlah potongan kode berikut menjadi program PHP yang benar.

Program ini menggunakan trait bernama IdentitasKendaraan yang memiliki abstract method getIdentitas(). Method ini diimplementasikan dalam class Sepeda.

Petunjuk: Tulis jawabanmu berupa urutan angka, dipisah dengan spasi. Contoh penulisan jawaban: 1 2 3 4 5 6

Catatan: Terdapat tiga baris dengan kurung kurawal tutup }. Untuk membantumu menyusun, perhatikan komentar di sampingnya yang menunjukkan penutup blok mana (fungsi, trait, atau class).

  • 1. use IdentitasKendaraan;
  • 2. return "Sepeda-101";
  • 3. class Sepeda {
  • 4. public function getIdentitas() {
  • 5. echo $sepeda->getIdentitas();
  • 6. trait IdentitasKendaraan {
  • 7. abstract public function getIdentitas();
  • 8. $sepeda = new Sepeda();
  • 9. } // penutup getIdentitas()
  • 10. } // penutup trait IdentitasKendaraan
  • 11. } // penutup class Sepeda