Access Modifiers — Encapsulation

লেসন ৪ / ৩৯

Access Modifiers কী?

Access modifier দিয়ে class-এর property ও method-এর দৃশ্যমানতা (visibility) নিয়ন্ত্রণ করা হয়। এটি Encapsulation এর মূল ভিত্তি।

তিনটি Access Modifier

Modifierএকই ClassChild Classবাইরে থেকে
public✅✅✅
protected✅✅❌
private✅❌❌

উদাহরণ

class BankAccount {
    public $accountHolder;        // সবার জন্য দৃশ্যমান
    protected $accountNumber;     // শুধু class ও child-এ
    private $balance = 0;          // শুধু এই class-এ

    public function __construct($name, $accNo) {
        $this->accountHolder = $name;
        $this->accountNumber = $accNo;
    }

    public function deposit($amount) {
        if ($amount > 0) {
            $this->balance += $amount;
            echo "{$amount} জমা হলো\n";
        }
    }

    public function withdraw($amount) {
        if ($amount <= $this->balance) {
            $this->balance -= $amount;
            echo "{$amount} উত্তোলন হলো\n";
        } else {
            echo "পর্যাপ্ত ব্যালেন্স নেই\n";
        }
    }

    public function getBalance() {
        return $this->balance;
    }
}

$acc = new BankAccount("করিম", "AC-1001");
echo $acc->accountHolder;   // ✅ "করিম"
echo $acc->balance;          // ❌ Fatal error (private)
$acc->balance = 99999999;    // ❌ Fatal error
echo $acc->getBalance();     // ✅ 0

$acc->deposit(5000);
echo $acc->getBalance();     // ✅ 5000

কেন Encapsulation গুরুত্বপূর্ণ?

  • ডেটা সুরক্ষা — balance সরাসরি পরিবর্তন করা যাবে না
  • Validation — deposit() এ amount check করা যায়
  • Internal logic পরিবর্তন সহজ — বাইরের code ভাঙবে না
  • Bug কম — ভুল ব্যবহারের সুযোগ কম

Getter ও Setter Pattern

Private property-তে access দিতে Getter/Setter ব্যবহার করা হয়।

class User {
    private $email;

    // Setter (validation সহ)
    public function setEmail($email) {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $this->email = $email;
        } else {
            throw new Exception("সঠিক ইমেইল দিন");
        }
    }

    // Getter
    public function getEmail() {
        return $this->email;
    }
}

$u = new User();
$u->setEmail("karim@example.com");  // ✅
echo $u->getEmail();
$u->setEmail("invalid");             // ❌ Exception

Property Type Declaration (PHP 7.4+)

class Product {
    public string $name;
    public float $price;
    public int $stock = 0;
    public ?string $description = null;  // nullable
    public array $tags = [];
}