PHP 5 অবজেক্ট-ওরিয়েন্টেড মডেল নিয়ে এসেছে, অবজেক্ট-ওরিয়েন্টেড মডেলের কিছু কনসেপ্ট রয়েছে: ক্লাস, অবজেক্ট, এনক্যাপসুলেশন, পলিমরফিজম, অ্যাবস্ট্রাক্ট এবং ফাইনাল ক্লাস ও মেথড, ইন্টারফেস এবং ইনহেরিটেন্স ইত্যাদি। এই আর্টিকেলে,
আমরা অ্যাবস্ট্রাক্ট ক্লাস এবং PHP-তে অবজেক্ট-ওরিয়েন্টেড টেকনিকের সাথে এর ফিচারগুলো আলোচনা করব। এছাড়া, আমরা অ্যাবস্ট্রাক্ট ক্লাসের ইমপ্লিমেন্টেশন কয়েকটি উদাহরণসহ শিখব।
গভীরে যাওয়ার আগে, চলুন শিখি অ্যাবস্ট্রাক্ট ক্লাস কীভাবে ডিফাইন করতে হয়।
একটি ক্লাসকে অ্যাবস্ট্রাক্ট ঘোষণা করা হয় ক্লাসের নামের সাথে abstract কিওয়ার্ড প্রিফিক্স করে। ডেফিনিশন খুব স্পষ্ট: যে ক্লাসে অ্যাবস্ট্রাক্ট মেথড থাকে সেটিকে অ্যাবস্ট্রাক্ট ক্লাস বলা হয়। অ্যাবস্ট্রাক্ট ক্লাসে ডিফাইন করা অ্যাবস্ট্রাক্ট মেথডগুলোর শুধু নাম আর আর্গুমেন্ট থাকে, অন্য কোনো কোড নেই।
একটি অ্যাবস্ট্রাক্ট ক্লাসের অবজেক্ট তৈরি করা যায় না। বরং, আমাদের চাইল্ড ক্লাস এক্সটেন্ড করতে হবে যারা অ্যাবস্ট্রাক্ট মেথডগুলোর বডি চাইল্ড ক্লাসে ইমপ্লিমেন্ট করবে এবং সেই চাইল্ড ক্লাসগুলো ব্যবহার করে অবজেক্ট তৈরি করতে হবে।
PHP-তে অ্যাবস্ট্রাক্ট ক্লাস সম্পর্কে কিছু গুরুত্বপূর্ণ তথ্য আলোচনা করা যাক:
১. একটি অ্যাবস্ট্রাক্ট ক্লাসে অ্যাবস্ট্রাক্ট ও নন-অ্যাবস্ট্রাক্ট উভয় মেথড থাকতে পারে।
উদাহরণ:
<?php
abstract class base {
abstract function printdata();
public function getdata() {
echo "Tutorials Point";
}
}
class child extends base{
public function printdata(){
echo "Good morning";
}
}
$obj = new child();
$obj->getdata();
?>
আউটপুট:
Tutorials Point
২. সরাসরি ইনস্ট্যানশিয়েট করা যায় না।
উদাহরণ:
<?php
abstract class AbstractClass{
abstract protected function calculate();
public function adddata() {
echo "Addition done";
}
}
$obj = new AbstractClass();
$obj->adddata();
?>
আউটপুট:
Fatal error: Uncaught Error: Cannot instantiate abstract class AbstractClass
৩. একই (বা কম রেস্ট্রিক্টেড) ভিজিবিলিটি:
সকল চাইল্ড ক্লাস অবশ্যই পেরেন্ট ক্লাসে অ্যাবস্ট্রাক্ট হিসেবে চিহ্নিত সকল মেথড ডিফাইন করতে হবে, এছাড়া এই মেথডগুলোর একই সিগনেচার বা কম রেস্ট্রিক্টেড সিগনেচার থাকতে হবে। ধরে নিন পেরেন্ট ক্লাসে একটি অ্যাবস্ট্রাক্ট মেথড প্রোটেক্টেড ভিজিবিলিটির সাথে ডিফাইন করা হয়েছে, চাইল্ড ক্লাসে ইমপ্লিমেন্টেশনে সেটি প্রোটেক্টেড বা পাবলিক হতে হবে, কিন্তু প্রাইভেট হতে পারবে না।
উদাহরণ:
<?php
abstract class AbstractBaseClass1{
abstract public function addValue();
abstract protected function getValue();
}
class ConcreteClass extends AbstractBaseClass1{
protected function addValue() {
return "ConcreteClass";
}
public function getValue() {
return " Child Class";
}
}
$classobj = new ConcreteClass;
$classobj->addValue();
?>
আউটপুট:
Fatal error: Access level to ConcreteClass::addValue() must be public (as in class AbstractBaseClass1)
৪. একটি অ্যাবস্ট্রাক্ট মেথড বডি ধারণ করতে পারে না:
অ্যাবস্ট্রাক্ট হিসেবে ডিক্লেয়ার করা মেথড শুধু মেথডের সিগনেচার ডিক্লেয়ার করে - সেগুলো কোনো বডি ডিফাইন করতে পারে না। যদিও নন-অ্যাবস্ট্রাক্ট মেথডে বডি থাকতে পারে।
উদাহরণ:
<?php
abstract class ParentClass{
abstract protected function printValue(){
return "Good morning";
}
}
class ClassA extends ParentClass{
protected function printValue() {
return "ConcreteClass1";
}
}
$classobj = new ClassA;
$classobj->printValue();
?>
আউটপুট:
PHP Fatal error: Abstract function ParentClass::printValue() cannot contain body
৫. কমপক্ষে একটি অ্যাবস্ট্রাক্ট মেথড ধারণকারী যেকোনো ক্লাস অবশ্যই অ্যাবস্ট্রাক্ট ক্লাস হিসেবে ডিক্লেয়ার করা উচিত:
একটি অ্যাবস্ট্রাক্ট ক্লাসে অ্যাবস্ট্রাক্ট ও নন-অ্যাবস্ট্রাক্ট মেথড থাকতে পারে, কিন্তু এতে কমপক্ষে একটি অ্যাবস্ট্রাক্ট মেথড থাকতে হবে। যদি এতে অ্যাবস্ট্রাক্ট মেথড থাকে তবে সেটিকে অবশ্যই অ্যাবস্ট্রাক্ট ডিক্লেয়ার করতে হবে।
উদাহরণ:
<?php
class AbstractClass {
abstract protected function getValue();
public function printData() {
echo " Welcome to Tutorials Point";
}
}
$obj = new AbstractClass();
$obj->printData();
?>
আউটপুট:
PHP Fatal error: Class AbstractClass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)
৬. অ্যাবস্ট্রাক্ট ক্লাস মাল্টিপল ইনহেরিটেন্স সাপোর্ট করে না:
এটি মাল্টিপল ইনহেরিটেন্স সাপোর্ট করে না।
উদাহরণ:
<?php
abstract class SuperClass{
public abstract function test();
protected function welcome(){
echo "Good morning";
}
}
class ClassA extends SuperClass{
public function test(){
echo "Hello";
}
protected function welcome(){
echo "Good afternoon";
}
}
class ClassB extends SuperClass{
public function test(){
echo "Hello";
}
protected function welcome(){
echo "Good evening";
}
}
class ClassC extends ClassA, ClassB{
public function test1(){
$c = new self();
$c->welcome();
}
}
?>
আউটপুট:
Error
ব্যাখ্যা:
এখানে SuperClass অ্যাবস্ট্রাক্ট ক্লাস হিসেবে ডিক্লেয়ার করা হয়েছে যাতে test() এবং welcome() মেথড রয়েছে, ClassA এবং ClassB কনক্রিট ক্লাস যা অ্যাবস্ট্রাক্ট ক্লাস থেকে এক্সটেন্ড করা হয়েছে। তারপর ClassC তৈরি করার চেষ্টা করা হয়েছে ClassA এবং ClassB এক্সটেন্ড করে। কোড থেকে স্পষ্ট, welcome() মেথড ClassC অবজেক্ট দিয়ে কল করার সময় কম্পাইলারের জন্য অসম্ভব হবে ClassA-এর welcome() নাকি ClassB-এর welcome() কল করতে হবে বলে সিদ্ধান্ত নেওয়া। এই জটিলতা এড়াতে PHP মাল্টিপল ইনহেরিটেন্স সাপোর্ট করে না।
নোট:
একটি অ্যাবস্ট্রাক্ট ক্লাস অন্য একটি অ্যাবস্ট্রাক্ট ক্লাস এক্সটেন্ড করতে পারে, অ্যাবস্ট্রাক্ট ক্লাস ইন্টারফেসের ইমপ্লিমেন্টেশন প্রদান করতে পারে।