PHP Object Oriented Programming
PHP Object Oriented Programming পর্ব-৬: PHP OOP Inheritance
Inheritance কি?
ইংরেজি শব্দ inheritance অর্থ হচ্ছে উত্তরাধিকার। Object Oriented Programming এ এক class থেকে কিছু ফাংশনালিটি (Methods) ও বৈশিষ্ট্য (Property) অন্য class এ শেয়ার করার একটা পদ্ধতি হচ্ছে Inheritance. বা কোন Class বা Object এ অন্য কোন Class বা Object এর বৈশিষ্ট্য অর্জন করে থাকে যে প্রক্রিয়ায় তাকে উত্তরাধিকার সূত্র বা Inheritance বলে। আরো সহজ ভাবে বলা যায় , একটা ক্লাসকে (Parent Class) Inherit (অনুসরণ) করে তার কিছু বৈশিষ্ট্য আরেকটি উত্তরসূরি (child class) এর মধ্যে ব্যবহার করার প্রক্রিয়াকে Inheritance বলা হয়।
PHP তে কিভাবে child class তৈরী হয় ?
child class তৈরী করতে হলে প্রথমে class কীওয়ার্ড এর পর child class এর নাম দিতে হয়, তারপর extends কীওয়ার্ড লিখে Parent Class এর নাম লিখতে হয়। যেমন:
<?php class ParentClass { // properties and methods here } class ChildClass extends ParentClass { // additional properties and methods here } ?>
PHP তে Inheritance কিভাবে কাজ করে?
মূলত Parent Class এবং Child Class ধারণার উপর ভিত্তি করে Inheritance ব্যাপারটি আসে। আপনি যখন একটা child class তৈরী করবেন , সেটি তার parent class এর সব protected এবং public Property, Method, Constant গুলো inherit করবে। আরো সহজ ভাবে বলা যায় , একটি class যখন আরেকটি class কে extend করে তখন Parent Class এর সব Protected এবং public Property, Method এবং constant, child class এ define না করেও ব্যবহার বা access করা যায় । পাশাপাশি child class আরো নতুন নতুন property এবং method অন্তর্ভুক্ত করতে পারবে। চলুন একটা Web Forum Application এর উদাহরণ দিয়ে আরো ভালো ভাবে বুঝা যাক:
<?php class Member { public $username = ""; private $loggedIn = false; public function login() { $this->loggedIn = true; } public function logout() { $this->loggedIn = false; } public function isLoggedIn() { return $this->loggedIn; } } ?>
ব্যাখ্যা: উপরের Member Class টি একটি Web Forum Application এর জন্য করা একটা Class। যেখানে ফোরাম মেম্বারদের জন্য login(), logout(), isLoggedIn() method তৈরী করা হয়েছে । যেহেতু ফোরাম অ্যাডমিনিস্ট্রেটররাও Member, এখন আপনি Member Class থেকে একটি নতুন Child class তৈরী করতে পারেন, যেটার নাম হবে Administrator Class . আর তাতে সুবিধা হচ্ছে Administrator class , Member class এর সব protected এবং public property, Method এবং constant গুলোকে Inherit বা উত্তরাধিকার সূত্রে পাবে। চলুন এবার Member Class থেকে child class হিসেবে Administrator Class টি তৈরী করা যাক:
<?php class Administrator extends Member { public function createForum( $forumName ) { echo "$this->username created a new forum: $forumName<br>"; } public function banMember( $member ) { echo "$this->username banned the member: $member->username<br>"; } } ?>
ব্যাখ্যা: লক্ষ্য করুন Administrator class এ আমাদের অনেক কাজ নতুন করে করা লাগবেনা , Administrator Class তার Member Parent Class দিয়ে login, logout এবং user logged In কিনা সেগুলো inherit করে নিজে ব্যবহার করতে পারবে। এখন আপনি administrator স্পেসিফিক Method গুলো যেমন : createForum(), deleteForum() এবং banMember() আপনার administrator class এ যোগ করতে পারবেন। আর এতে সুবিধা হচ্ছে আপনি administrator class এ একই সাথে সাধারণ Member Class এর সুবিধা পাচ্ছেন, পাশাপাশি Administrative সুবিধা গুলোও পাচ্ছেন। আর এটাই inheritance. চলুন এবার Parent এবং Child Class দুটির উদাহরণ একসাথে দেখা যাক
<?php class Member { public $username = ""; private $loggedIn = false; public function login() { $this->loggedIn = true; } public function logout() { $this->loggedIn = false; } public function isLoggedIn() { return $this->loggedIn; } } class Administrator extends Member { public function createForum( $forumName ) { echo "$this->username created a new forum: $forumName<br>"; } public function banMember( $member ) { echo "$this->username banned the member: $member->username<br>"; } } // Create a new member and log them in $member = new Member(); $member->username = "Masud Alam"; $member->login(); echo $member->username . " is " . ( $member->isLoggedIn() ? "logged in" : "logged out" ) . "<br>"; // Create a new administrator and log them in $admin = new Administrator(); $admin->username = "Farhan"; $admin->login(); echo $admin->username . " is " . ( $member->isLoggedIn() ? "logged in" : "logged out" ) . "<br>"; // Displays "Mary created a new forum: W3programmers" $admin->createForum( "W3programmers" ); // Displays "Farhan banned the member: Masud Alam" $admin->banMember( $member ); ?>
ব্যাখ্যা: লক্ষ্য করুন, লাইন নম্বর ৩৩,৩৪,৩৫ এ Administrator Object handler দিয়ে যেই সব property এবং Method গুলো ব্যবহার করেছি সেগুলোর কোনোটিই Administrator Class এর Property এবং Method না। সবগুলো Member Class থেকে child হিসেবে Inherit বা উত্তরাধিকার হিসেবে পাওয়া। আর এই জন্যই এগুলো Administrator class এর object দিয়ে ব্যবহার করতে পেরেছি।
Inheritance ব্যবহার করে আরেকটি উদাহরণ :
<?php /** Check User Exist or Not */ class Member { protected $isLoggedIn=false; protected $role; protected $users=[ ["username"=>"abc","password"=>"xyz","role"=>"subscriber"], ["username"=>"acb","password"=>"yxz","role"=>"admin"], ["username"=>"bca","password"=>"zxy","role"=>"super_admin"] ]; public function Login($user,$pass){ foreach($this->users as $user_info){ extract($user_info); if($username==$user && $password==$pass){ $this->isLoggedIn=true; $this->role=$role; } } } } /** * Child Class Check User Role **/ class Role extends Member { function __construct($user,$pass) { $this->Login($user,$pass); if($this->isLoggedIn){ if($this->role=='subscriber'){ echo "You're Logged in as a Subscriber"; } if($this->role=='admin'){ echo "You're Logged in as a Administrator"; } if($this->role=='super_admin'){ echo "You're Logged in as a Super Administrator"; } } else{ echo "Invalid Username/Password"; } } } $login=new Role("acb","yxz");
Method Overriding কি?
সাধারণত যখন একটা child class তৈরী হয়, তখন সেটি তার parent class এর সব Protected Property এবং Method গুলোকে Inherit করে নিয়ে আসে। কিন্তু কখনো কখনো আমাদেরকে Parent Class এর যেকোনো Method কে Child Class এ নতুন করে একই নামে লেখার দরকার হয়, এটা সাধারণত তখনই দরকার হয় , যখন দেখা যায়, Parent Class এর Method টি child class এর সব পারপাস পূরণ করতে পারছেনা। অর্থাৎ, আরো কিছু feature add করার দরকার হয়। Object Oriented Programming এর পরিভাষায় এটাকে বলা হয় Method Overriding. এক কোথায় , Parent Class এর কোনো Method কে Child Class এ একই নামে এবং সমান সংখ্যক parameter দিয়ে পুনরায় declare করলে Object Oriented Programming এর পরিভাষায় বলা হয় Method Overriding. নিচের উদাহরণটি দেখুন :
class ParentClass { public function myMethod($x) { // (method code here) } } class ChildClass extends ParentClass { public function myMethod($x) { // For ChildClass objects, this method is called // instead of the parent class's MyMethod() } }
এবার একটা practical উদাহরণ দেওয়া যাক : দরুন আমাদের Member class টির login Method টি শুধু Login কাজটি করে। এখন যদি Administrator Class চায় , কখন কে লগইন করলো তার একটা log Entry রাখা দরকার। আর এর জন্য আমরা Method Overriding Feature টি ব্যবহার করবো। চলুন দেখা যাক :
<?php class Member { public $username = ""; private $loggedIn = false; public function login() { $this->loggedIn = true; } public function logout() { $this->loggedIn = false; } } class Administrator extends Member { public function login() { $this->loggedIn = true; echo "Log entry: $this->username logged in<br>"; } } // Create a new member and log them in $member = new Member(); $member->username = "Masud Alam"; $member->login(); $member->logout(); // Create a new administrator and log them in $admin = new Administrator(); $admin->username = "Farhan"; $admin->login(); // Displays "Log entry: Farhan logged in" $admin->logout();
Parent Class এর কোনো Method কে Child Class এর Method এর মধ্যে ব্যবহারের নিয়ম কি?
Parent Class এর কোনো Method কে child Class ব্যবহার করতে চাইলে Parent Keyword এবং scope resolution operator :: ব্যবহার করতে হয় । ঠিক এই রকম :
parent::parentMethod();
এবার একটা practical উদাহরণ দেওয়া যাক : লক্ষ্য করবেন , উপরের Method Overriding উদাহরণে আমরা child class এ login Method এ Parent Class এর login এর সব কোডই ব্যবহার করেছি। কিন্তু আমরা যদি parent কীওয়ার্ড টি ব্যবহার করতাম, তাহলে আমাদের কষ্ট করে Parent Class এর login এর সব কোড আবার লেখা প্রয়োজন হতো না। নিচের উদাহরণ দেখুন।
<?php class Member { public $username = ""; private $loggedIn = false; public function login() { $this->loggedIn = true; } public function logout() { $this->loggedIn = false; } } class Administrator extends Member { public function login() { parent::login(); // Using parent keyword echo "Log entry: $this->username logged in<br>"; } } // Create a new member and log them in $member = new Member(); $member->username = "Masud Alam"; $member->login(); $member->logout(); // Create a new administrator and log them in $admin = new Administrator(); $admin->username = "Farhan"; $admin->login(); // Displays "Log entry: Farhan logged in" $admin->logout();
ব্যাখ্যা : খেয়াল করুন ১৪ নম্বর লাইনে আমরা parent class এর হুবহু code copy না করে parent keyword ব্যবহার করেছি।
Inheritance বন্ধ (prevent) করার উপায় কি?
Class Inheritance বন্ধ বা Prevent করা মানে হচ্ছে ঐ class থেকে child class তৈরী এবং Method Overriding বন্ধ করা। অনেক সময় Inheritance এবং Method Overriding এর কারণে class এর security এর সমস্যা হতে পারে, আবার program complex আকার ধারণ করতে পারে। আর সে জন্য Class এবং Method এর security এর জন্য child class তৈরী এবং Method Overriding বন্ধ রাখতে হয়, আর child class তৈরী এবং Method Overriding বন্ধ করার জন্য PHP তে class এর নামের এবং Method এর নামের আগে final keyword ব্যবহার করতে হয়। চলুন প্রথমে দেখা যাক Final keyword দিয়ে কিভাবে Method Overriding বন্ধ করা যায়:
<?php class Member { public $username = ""; private $loggedIn = false; public final function login() { $this->loggedIn = true; } public function logout() { $this->loggedIn = false; } public function isLoggedIn() { return $this->loggedIn; } } class NaughtyMember extends Member { public function login() { $this->loggedIn = true; // Do something bad } } ?>
Result:
Fatal error: Cannot override final method Member::login()
এবার চলুন দেখা যাক Final keyword দিয়ে কিভাবে class Inheritance বন্ধ করা যায়:
<?php final class Member { // This class can't be extended at all } class Administrator extends Member{ // Will show Fatal Error } ?>
Result:
Fatal error: Class Administrator may not inherit from final class (Member) in on line 7