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 - V6class 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.
Tantangan
MudahMari 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 classDeviceyang merepresentasikan perangkat elektronik dengan tingkat sensitivitas data yang berbeda. Sertakan:- Property
public$branduntuk nama produsen - Property
protected$modelNumberuntuk identifikasi internal - Property
private$manufacturingCodeuntuk data khusus pabrik
privategetManufacturingCode()yang mengembalikan kode produksi. Tambahkan methodpublicgetModelInfo()yang mengembalikan"Model: [modelNumber]". Terakhir, tambahkan methodpublicgetFullCode()yang mengembalikan"[brand]-[manufacturingCode]". Ini menunjukkan bagaimana class itu sendiri dapat mengakses anggota private miliknya.- Property
Smartphone.php: Buat classSmartphoneyang memperluasDevice. 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 publicgetDeviceDetails()yang mengembalikan"[brand] [modelNumber] running [os]". Perhatikan bahwa kamu dapat mengakses$brandyang public secara langsung dan$modelNumberyang protected, tetapi kamu tidak dapat mengakses$manufacturingCodeyang private secara langsung. Sebagai gantinya, kamu perlu menggunakan method public turunangetFullCode().main.php: Sertakan file Smartphone. Kamu akan menerima empat input: nama brand, nomor model, kode produksi, dan sistem operasi. Buat instanceSmartphonedengan nilai-nilai ini. Cetak tiga baris:- Hasil pemanggilan
getDeviceDetails() - Hasil pemanggilan method turunan
getModelInfo() - Hasil pemanggilan method turunan
getFullCode()
- Hasil pemanggilan
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
?>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