আগের পাঠে হাতে হাতে, প্রপার্টি ধরে ধরে একটি ক্লাস তৈরি করা হয়েছিল। এই পাঠে সেই তিনটি বৈশিষ্ট্য দেখানো হবে যা বাস্তবে ক্লাসকে সত্যিকারভাবে শক্তিশালী করে তোলে।
একটি কনস্ট্রাক্টর — __construct() নামের একটি বিশেষ মেথড — একটি অবজেক্ট তৈরি হওয়া মাত্র স্বয়ংক্রিয়ভাবে চলে, যাতে পরে আপনাকে হাতে হাতে প্রতিটি প্রপার্টি সেট করতে না হয়:
<?php
class Student {
public $name;
public $course;
public function __construct($name, $course) {
$this->name = $name;
$this->course = $course;
}
}
$student = new Student("Priya", "Web Development"); // set in one line
?>| কীওয়ার্ড | কোথা থেকে অ্যাক্সেসযোগ্য |
|---|---|
| public | যেকোনো জায়গা থেকে — ক্লাসের ভেতরে, আর বাইরে থেকেও |
| private | শুধু এই নির্দিষ্ট ক্লাসের ভেতর থেকে |
| protected | এই ক্লাস, আর এর থেকে inherit করা যেকোনো ক্লাস |
<?php
class BankAccount {
private $balance = 0;
public function deposit($amount) {
$this->balance += $amount;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(500);
echo $account->getBalance(); // 500
// echo $account->balance; // Error — private, not accessible from outside
?>কেন private নিয়ে এত মাথাব্যথা?
একটি প্রপার্টিকে private করা আর শুধু getBalance()-এর মতো মেথডের মাধ্যমে সেটা প্রকাশ করাকে বলে এনক্যাপসুলেশন — এটি বাইরের কোডকে সরাসরি $balance-কে একটি অবৈধ মানে সেট করতে বাধা দেয়, কারণ প্রতিটি পরিবর্তন আপনার নিয়ন্ত্রিত একটি মেথডের মধ্য দিয়ে যেতে হয়।
ইনহেরিটেন্স একটি ক্লাসকে extends দিয়ে আরেকটির উপর ভিত্তি করে তৈরি করতে দেয়, সেটার প্রপার্টি আর মেথড আবার না লিখে পুনঃব্যবহার করে:
<?php
class Person {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function greet() {
return "Hi, I'm {$this->name}.";
}
}
class Student extends Person {
public $course;
public function __construct($name, $course) {
parent::__construct($name); // reuse Person's constructor
$this->course = $course;
}
}
$s = new Student("Amit", "Graphic Design");
echo $s->greet(); // "Hi, I'm Amit." — inherited from Person, unchanged
?>parent:: extend করা ক্লাস থেকে একটি মেথড কল করে — উপরের মতো, একটি parent-এর কনস্ট্রাক্টর ডুপ্লিকেট না করে পুনঃব্যবহার করতে সাধারণভাবে ব্যবহৃত হয়।