Menu
CoddyTech

Public, Protected, Private

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

Selamat datang di bab Enkapsulasi! Enkapsulasi adalah tentang mengendalikan akses ke data internal class-mu. PHP menyediakan tiga pengubah akses yang menentukan dari mana property dan method dapat diakses: public, protected, dan private.

Berikut cara kerja setiap modifier:

<?php
class BankAccount {
    public $accountHolder;    // Bisa diakses dari mana saja
    protected $accountNumber; // Bisa diakses dalam class ini dan class turunannya
    private $balance;         // Hanya bisa diakses dalam class ini
    
    public function __construct($holder, $number, $balance) {
        $this->accountHolder = $holder;
        $this->accountNumber = $number;
        $this->balance = $balance;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount("John", "12345", 1000);

echo $account->accountHolder . "\n";  // Berfungsi, public
echo $account->getBalance();          // Berfungsi, method public

Output:

John
1000

Mencoba mengakses $account->balance secara langsung akan menyebabkan error karena bersifat private. Hal yang sama berlaku untuk $account->accountNumber dari luar hierarki class. Perlindungan ini memastikan bahwa data sensitif hanya dapat diubah melalui method yang terkontrol.

ModifierClass yang SamaClass TurunanDi Luar
publicYaYaYa
protectedYaYaTidak
privateYaTidakTidak

Poin Penting: Gunakan private untuk data internal yang tidak boleh diakses secara langsung, protected untuk data yang dibutuhkan oleh class turunan, dan public hanya untuk akses eksternal yang aman.

challenge icon

Tantangan

Mudah

Mari kita bangun sistem manajemen karyawan yang aman untuk menunjukkan cara modifier akses melindungi data sensitif. Kamu akan membuat hierarki class dengan tingkat informasi yang berbeda, yang dapat diakses bergantung pada lokasi kode dijalankan: di dalam class, di dalam child class, atau dari luar.

Kamu akan mengatur kodemu dalam tiga file:

  • Employee.php: Buat class Employee yang mengelola data karyawan dengan tingkat visibilitas yang sesuai. Class ini harus memiliki:
    • Property public $name untuk nama karyawan (aman dilihat siapa saja)
    • Property protected $employeeId untuk ID internal (dibutuhkan oleh child class)
    • Property private $salary untuk informasi gaji yang sensitif (hanya class ini yang boleh mengaksesnya secara langsung)
    Constructor harus menerima ketiga nilai dan menetapkannya. Tambahkan method getSalary() public yang mengembalikan gaji private. Ini adalah cara terkontrol untuk mengakses data yang dilindungi. Tambahkan juga method getPublicInfo() public yang mengembalikan "[name] works here".
  • Manager.php: Buat class Manager yang mewarisi Employee. Sertakan file Employee. Constructor harus menerima nama, employeeId, gaji, dan nama departemen. Panggil constructor parent dengan tiga nilai pertama, lalu simpan departemen dalam property private. Tambahkan method getTeamInfo() public yang mengembalikan "Manager [name] (ID: [employeeId]) leads [department]". Perhatikan bahwa child class dapat mengakses $employeeId yang protected, tetapi harus menggunakan getSalary() untuk mengakses gaji yang private.
  • main.php: Sertakan file Manager. Kamu akan menerima empat input: nama, ID karyawan, gaji (sebagai string yang akan kamu ubah menjadi integer), dan nama departemen. Buat instance Manager dengan nilai-nilai ini. Cetak tiga baris:
    • Nama manager yang diakses secara langsung (property public)
    • Hasil pemanggilan getTeamInfo()
    • Hasil pemanggilan getSalary()

Tantangan ini menunjukkan enkapsulasi dalam praktik: nama dapat diakses secara bebas, ID karyawan dibagikan kepada child class melalui visibilitas protected, dan gaji tetap tersembunyi di dalam parent class, hanya dapat diakses melalui method public yang terkontrol.

Coba sendiri

<?php
require_once 'Manager.php';

// Baca input
$name = trim(fgets(STDIN));
$employeeId = trim(fgets(STDIN));
$salary = intval(trim(fgets(STDIN)));
$department = trim(fgets(STDIN));

// TODO: Buat instance Manager dengan nilai input

// TODO: Cetak nama manajer (akses langsung sebagai property publik)

// TODO: Cetak hasil pemanggilan getTeamInfo()

// TODO: Cetak hasil pemanggilan getSalary()
?>
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