Menu
CoddyTech

Kata Kunci final

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 24 dari 91.

Meskipun pewarisan dan penggantian method memberikan fleksibilitas, terkadang kamu perlu mencegah class atau method tertentu diubah. Kata kunci final mengunci kodemu, sehingga implementasi tertentu tidak dapat diubah oleh class turunan.

Jika kamu menandai method sebagai final, tidak ada class turunan yang dapat meng-override-nya:

<?php
class BankAccount {
    protected $balance;
    
    public function __construct($balance) {
        $this->balance = $balance;
    }
    
    final public function getAccountId() {
        return "ACC-" . spl_object_id($this);
    }
}

class SavingsAccount extends BankAccount {
    public function addInterest() {
        return $this->balance * 0.05;
    }
}

$account = new SavingsAccount(1000);
echo $account->getAccountId();

Output:

ACC-1

method getAccountId() tidak dapat di-override di SavingsAccount atau class turunan lainnya. Ini melindungi fungsionalitas penting yang harus tetap konsisten di semua jenis akun.

Kamu juga bisa menandai seluruh class sebagai final untuk mencegah pewarisan apa pun:

<?php
final class SecurityManager {
    public function authenticate($user) {
        return "Authenticating $user";
    }
}

$security = new SecurityManager();
echo $security->authenticate("admin");

Output:

Authenticating admin

Tidak ada class yang dapat mewarisi SecurityManager. Ini berguna untuk class yang sensitif terhadap keamanan atau ketika desain class sudah selesai dan tidak boleh diubah.

Poin Utama: Gunakan final pada method untuk mencegah overriding sambil tetap memungkinkan pewarisan, atau pada class untuk sepenuhnya mencegah pewarisan. Ini adalah alat untuk melindungi kode penting yang harus bekerja persis seperti yang dirancang.

challenge icon

Tantangan

Mudah

Mari kita buat sistem manajemen dokumen yang menunjukkan cara kata kunci final melindungi fungsi penting agar tidak diubah oleh class turunan.

Kamu akan membuat tiga file yang bekerja sama untuk mengelola berbagai jenis dokumen, sekaligus memastikan fitur keamanan tertentu tetap terkunci:

  • Document.php: Definisikan class Document yang menjadi dasar bagi semua dokumen. Class ini harus memiliki property publik $title dan property terlindungi $author. Konstruktor menerima title dan author. Sertakan method final bernama getSignature() yang mengembalikan "Signed by: [author]". Fitur keamanan ini tidak boleh diubah oleh class turunan. Tambahkan juga method biasa getContent() yang mengembalikan "Document: [title]".
  • Report.php: Definisikan class Report yang mewarisi Document. Sertakan file Document di bagian atas. Class ini menambahkan property $department. Konstruktor harus menerima title, author, dan department: gunakan parent::__construct() untuk dua nilai pertama, lalu tetapkan department. Override method getContent() agar mengembalikan "Report: [title] ([department])". Class Report mewarisi method getSignature() yang bersifat final, sehingga tidak dapat mengubahnya.
  • main.php: Sertakan file Report. Kamu akan menerima tiga input: judul dokumen, nama author, dan department. Buat object Report dengan nilai-nilai ini. Cetak hasil getContent() pada baris pertama, lalu cetak hasil getSignature() pada baris kedua.

Tantangan ini menunjukkan cara method final melindungi fungsi penting: pembuatan signature tetap konsisten pada semua jenis dokumen, sementara method lain seperti getContent() dapat disesuaikan oleh setiap class turunan. Class Report dapat mengubah cara konten ditampilkan, tetapi format signature terkunci di class induk.

Coba sendiri

<?php
require_once 'Report.php';

// Baca input
$title = trim(fgets(STDIN));
$author = trim(fgets(STDIN));
$department = trim(fgets(STDIN));

// TODO: Buat object Report dengan nilai input

// TODO: Cetak hasil getContent()

// TODO: Cetak hasil getSignature()
?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online