PHP OOP Part-3: Access modifier, Encapsulation and Inheritance
Access modifier কি? PHP তে ৩ ধরণের Access modifier রয়েছে। এ access modifiers গুলো ক্লাসের প্রোপার্টি (properties) এবং মেথড (methods) গুলোকে অন্য যে কোন একটি স্পেসিফিক ক্লাসের এক্সেস কন্ট্রোল করে। অর্থাৎ কিভাবে Access করবে কতটুকু Access করবে ইত্যাদি কন্ট্রোল করে। তাহলে এই এক্সেস মডিফায়ার গুলো কি কি?
- public: এই মোডিফায়ার দ্বারা ডিফিনেড প্রোপার্টি বা মেথড ক্লাসের বাইরে সকলের দ্বারা এক্সেস করা যায়।
- protected: এই মোডিফায়ার দ্বারা ডিফিনেড প্রোপার্টি বা মেথড ক্লাসের বাইরে এক্সেস করা যাবে না, তবে সাবক্লাসের মধ্যে এক্সেস করা যায়। সাবক্লাস কি তা আমরা পরের Lession এ জানতে পারবো।
- private: এই মোডিফায়ার দ্বারা ডিফিনেড প্রোপার্টি বা মেথড ক্লাসের বাইরে বা সাবক্লাসের মধ্যেও এক্সেস করা যায় না, শুধুমাত্র ডিফাইন করা ক্লাসের ভিতরেই এক্সেস করা যায়।
এই অ্যাক্সেস মডিফায়ারগুলো ব্যবহার করতে হলে আমাদেরকে তিনটি keyword এর সাহায্য নিতে হবে সেগুলো হলো public, protected এবং private। এখন প্রপার্টি বা মেথডগুলো define এর পূর্বেই এই keyword গুলোকে ব্যবহার করতে হবে। এখানে মনে রাখতে হবে যে যদি আমরা কোন প্রপার্টি বা মেথডের পূর্বে কোনো Access modifier keyword ব্যবহার না করি তাহলে সেটি default ভাবে public হিসেবে consider করা হবে অর্থাৎ যদি আমরা কোনো মোডিফায়ার স্পেসিফাই না করি তবে তা ডিফল্ট হিসেবে public ধরে নেয়া হয়।
একটি উদাহারণ দেখা যাক।
class MyClass {
public $publicVar; // Accessible from anywhere
protected $protectedVar; // Accessible from this class and subclass
private $privateVar; // Accessible from only this class
public function publicMethod() {
// Accessible from anywhere
}
protected function protectedMethod() {
// Accessible from this class and subclass
}
private function privateMethod() {
// Accessible from only this class
}
}
এই Access modifier গুলো ব্যবহার করে আমরা ক্লাসের ডেটা এবং ফাংশনালিটির এক্সেস কন্ট্রোল করতে পারব, যা একটি ক্লাসের ইনক্যাপসুলেশন এবং সিকিউরিটির সাথে সম্পর্কিত।
What is Encapsulation?
Encapsulation হল গোপনীয়তা বা তথ্য সংরক্ষণের উদ্দেশ্যে একটি নতুন সত্তা তৈরির প্রক্রিয়া। অর্থাৎ একটি ক্লাস এর অনেক ধরনের Property এবং Method থাকতে পারে। এই Property এবং Method এই ক্লাস এর বাহিরে কিভাবে Access করা যাবে সেটা আমরা Access Modifier এর মাধ্যমে বলে দিতে পারি। তাই সহজ ভাষায় বল্লে এটাই আসলে Encapsulation । বিভিন্ন লেভেলে ইনক্যাপসুলেশন হয়ে থাকে:
Property Label Encapsulation: প্রোপার্টি হলো একটি ক্লাসের ডেটা মেম্বার, যা সেই ক্লাসের অবজেক্টের সাথে সংযুক্ত থাকে। প্রোপার্টি গুলো default ভাবে public থাকে কিন্তু আমরা চাইলে private বা protected এক্সেস মোডিফায়ার দ্বারা সুরক্ষিত করতে পারি, যাতে ডেটা সরাসরি বাইরের কোড থেকে এক্সেস করা না যায়। আর একে বলে Property Label Encapsulation.
Method Label Encapsulation: মেথড হলো একটি ক্লাসের ফাংশন বা অপারেশন, যা সেই ক্লাসের ইনস্ট্যান্সের সাথে সম্পর্কিত কাজ করে। একটা Method এর মধ্যে অনেক অনেক Implementation থাকতে পারে যেগুলা আমরা বাইরের ক্লাস থেকে Hide করে রাখতে পারি এবং শুধু মাত্র method ব্যবহার করার permission দিতে পারি। আর একে বলে Method Label Encapsulation।
Class Level Label Encapsulation: এই লেভেলে, ক্লাসের প্রোপার্টি এবং মেথডগুলোকে Class এর মধ্যে গোপনীয়ভাবে সংরক্ষণ করা হয়, এবং এই প্রোপার্টি ও মেথডগুলো একটি স্পেসিফিক ক্লাসের বাইরে সরাসরি এক্সেস করা যায় না বরং ইনহেরিট করে এক্সেস করা করা যেতে পারে। তখন একে বলা হয় Class Level Label Encapsulation ।
এগুলো ছাড়াও আরো বিভিন্ন লেভেলে encapsulation করা যেতে পারে।
What is Inheritance?
Inheritance হলো একটি প্রোগ্রামিং কনসেপ্ট যেখানে একটি ক্লাস (class) অন্য একটি ক্লাস থেকে প্রোপার্টিস এবং মেথড গুলোকে ইনহেরিট করে নেয়। ইনহেরিট করে নেওয়া কথাটি যদি আরেকটু সহজকরে বলি তাহলে বলা যায় যে, ধরি একটা ক্লাসে কিছু প্রপার্টি এবং মেথড রয়েছে। এখন এই প্রপার্টি এবং মেথডগুলোকে আমাদের ওপর আরেকটি ক্লাসেও প্রয়োজন পারে। এখন আমরা চাইলে খুব সহজেই সেই নতুন ক্লাসে ওই প্রপার্ট এবং মেথডগুলোকে আবার না লিখে সেই পূর্বের ক্লাস থেকে নিয়ে এসে এই নতুন ক্লাসের মধ্যে আমরা ব্যবহার করতে। এই কনসেপ্টটাকেই মূলত বলা হয় ইনহেরিটেন্স। এই ইনহেরিটেন্সের মূল উদ্দেশ্য হলো কোড কে রি ইউজ করা এবং কোডের ডুপ্লিকেশনকে এভয়েড করা।
একটি ক্লাস, যদি অন্য আরেকটি ক্লাসকে ইনহেরিট করে, তাকে বলে সাবক্লাস (subclass) বা চাইল্ড (Child class) ক্লাস এবং যে ক্লাসকে ইনহেরিট হয়, তা বলে সুপারক্লাস (superclass) বা প্যারেন্ট ক্লাস (parent class)। সাবক্লাস সুপারক্লাস ক্লাসের প্রোপার্টিস এবং মেথডগুলি ব্যবহার করতে পারে এবং প্রয়োজনে সুপারক্লাসের মৌলিক প্রোপার্টিস এবং মেথডগুলির Overwrite ও করতে পারে।
এটি একটি উদাহরণ দেওয়া হলো:
class Vehicle
{
public $name;
public $color;
public function start()
{
// start login
}
public function stop()
{
// stop login
}
}
class Car extends Vehicle
{
function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function carInfo()
{
echo "Car name: $this->name\n";
echo "Car color: $this->color\n";
}
}
class Bus extends Vehicle
{
function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function busInfo()
{
echo "Bus name: $this->name\n";
echo "Bus color: $this->color\n";
}
}
$toyota = new Car('Toyota', 'Red');
$toyota->start();
$toyota->carInfo();
$toyota->stop();
$tesla = new Bus('Zip', 'Blue');
$tesla->start();
$tesla->busInfo();
$tesla->stop();
উপরের উদাহারণ এ দেখতে পাচ্ছি যে Vehicle class কে Car এবং Bus এরা Inherit করেছে। এর ফলে আমরা Vehicle class এর যে সব Property এবং Method Public অথবা Protected সেই সব Property এবং Method গুলাকে এর subclass এর মধ্যে access করতে পারতেছি।
Multi-label Inheritance কি?
আমরা চাইলে Multi-label Inheritance ও করতে পারি। ****মনে করি A, B, C তিনটি Class। এখন যদি A Class কে B Class inherit করে তার পরে যদি এই B Class আবার C Class inherit করে তাহলে A এবং B এই উভয় Class এর যে সব Property এবং Method Public অথবা Protected রয়েছে সেই সব কিছুই এখন C Class access করতে পারবে। এটিই হচ্ছে Multi-label Inheritance। একটি উদাহারণ দেখা যাক।
class Vehicle
{
public $name;
public $color;
public function start()
{
// start login
}
public function stop()
{
// stop login
}
}
class Car extends Vehicle
{
function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function carInfo()
{
echo "Car name: $this->name\n";
echo "Car color: $this->color\n";
}
}
class ElectricCar extends Car
{
private $batteryCapacity;
function __construct(string $name, string $color, int $batteryCapacity)
{
$this->name = $name;
$this->color = $color;
$this->batteryCapacity = $batteryCapacity;
}
public function electricCarInfo()
{
echo "Electric Car name: $this->name\n";
echo "Electric Car color: $this->color\n";
echo "Battery Capacity: {$this->batteryCapacity} kWh\n";
}
}
$teslaModelS = new ElectricCar('Tesla Model S', 'Black', 100);
$teslaModelS->start();
$teslaModelS->electricCarInfo();
$teslaModelS->stop();
এই উদাহারণ এ Vehicle class কে inherit করেছে Car class এবং সব শেষে Car class inherit করেছে ElectricCar class যার ফলে এখানে Multi-label Inheritance ঘটেছে।
আশা করি এই পর্বের আলোচিত বিষয় গুলো সম্পর্কে আপনাদের প্রাথমিক ধারণা হয়েছে। তাহলে আজ এই পর্যন্তই, কথা হবে পরবর্তী লেছনে।