Menu
CoddyTech

Modifier Akses secara Mendalam

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

Sekarang setelah kamu memahami tiga modifier akses, mari kita pelajari perilakunya dalam skenario pewarisan. Hal penting yang perlu dipahami adalah anggota protected dapat diakses oleh class turunan, sedangkan anggota private tetap tersembunyi bahkan dari class turunan.

<?php
class Vehicle {
    public $brand;
    protected $engineType;
    private $serialNumber;
    
    public function __construct($brand, $engine, $serial) {
        $this->brand = $brand;
        $this->engineType = $engine;
        $this->serialNumber = $serial;
    }
    
    private function getSerial() {
        return $this->serialNumber;
    }
    
    protected function getEngineInfo() {
        return $this->engineType;
    }
}

class Car extends Vehicle {
    public function getDetails() {
        return $this->brand . " - " . $this->getEngineInfo();
        // $this->serialNumber akan menyebabkan error karena bersifat private!
        // $this->getSerial() juga akan gagal karena merupakan method private!
    }
}

$car = new Car("Toyota", "V6", "ABC123");
echo $car->getDetails();

Output:

Toyota - V6

class Car dapat mengakses $brand (public) dan memanggil getEngineInfo() (protected), tetapi tidak dapat mengakses $serialNumber atau getSerial() karena keduanya bersifat private di Vehicle. Perbedaan ini memungkinkan kamu membagikan beberapa detail internal kepada class turunan sambil tetap menyembunyikan detail lainnya sepenuhnya.

Poin Penting: Gunakan protected saat class turunan perlu mengakses data atau method internal, dan gunakan private saat bahkan class turunan pun tidak boleh menyentuh detail implementasi tertentu.

challenge icon

Tantangan

Mudah

Mari kita bangun sistem pengelolaan perangkat yang mengeksplorasi cara kerja modifier akses pada pewarisan. Kamu akan membuat class dasar Device dengan property pada tingkat visibilitas yang berbeda, lalu memperluasnya dengan class Smartphone untuk menunjukkan anggota mana yang dapat dan tidak dapat diakses oleh class turunan.

Kamu akan mengatur kodemu dalam tiga file:

  • Device.php: Buat class Device yang merepresentasikan perangkat elektronik dengan tingkat sensitivitas data yang berbeda. Sertakan:
    • Property public $brand untuk nama produsen
    • Property protected $modelNumber untuk identifikasi internal
    • Property private $manufacturingCode untuk data khusus pabrik
    Konstruktor harus menerima ketiga nilai tersebut. Tambahkan method private getManufacturingCode() yang mengembalikan kode produksi. Tambahkan method public getModelInfo() yang mengembalikan "Model: [modelNumber]". Terakhir, tambahkan method public getFullCode() yang mengembalikan "[brand]-[manufacturingCode]". Ini menunjukkan bagaimana class itu sendiri dapat mengakses anggota private miliknya.
  • Smartphone.php: Buat class Smartphone yang memperluas Device. Sertakan file Device. Konstruktor harus menerima brand, modelNumber, manufacturingCode, dan nama sistem operasi. Panggil konstruktor induk dengan tiga nilai pertama, lalu simpan OS dalam property private. Tambahkan method public getDeviceDetails() yang mengembalikan "[brand] [modelNumber] running [os]". Perhatikan bahwa kamu dapat mengakses $brand yang public secara langsung dan $modelNumber yang protected, tetapi kamu tidak dapat mengakses $manufacturingCode yang private secara langsung. Sebagai gantinya, kamu perlu menggunakan method public turunan getFullCode().
  • main.php: Sertakan file Smartphone. Kamu akan menerima empat input: nama brand, nomor model, kode produksi, dan sistem operasi. Buat instance Smartphone dengan nilai-nilai ini. Cetak tiga baris:
    • Hasil pemanggilan getDeviceDetails()
    • Hasil pemanggilan method turunan getModelInfo()
    • Hasil pemanggilan method turunan getFullCode()

Tantangan ini menyoroti perbedaan utama: class Smartphone milikmu dapat menggunakan $modelNumber yang protected dan diwarisi dari Device dengan bebas, tetapi $manufacturingCode dan getManufacturingCode() yang private tetap sepenuhnya tersembunyi. Keduanya hanya dapat diakses melalui antarmuka public yang dipilih Device untuk diekspos.

Coba sendiri

<?php
require_once 'Smartphone.php';

// Baca input
$brand = trim(fgets(STDIN));
$modelNumber = trim(fgets(STDIN));
$manufacturingCode = trim(fgets(STDIN));
$os = trim(fgets(STDIN));

// TODO: Buat instance Smartphone dengan nilai input

// TODO: Cetak hasil getDeviceDetails()

// TODO: Cetak hasil method getModelInfo() yang diwarisi

// TODO: Cetak hasil method getFullCode() yang diwarisi
?>
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