এই দুটোই একই রকম একটি সমস্যা সমাধান করে: নিশ্চিত করা যে অন্যথায় ভিন্ন একদল ক্লাস সবাই একটি নির্দিষ্ট সেট মেথড দেয়, যাতে যে কোড এদের ব্যবহার করে তার ঠিক কোন ক্লাসের সাথে কাজ করছে তা নিয়ে মাথা ঘামাতে না হয়।
একটি ইন্টারফেস একটি ক্লাস কার্যকর করার প্রতিশ্রুতি দেওয়া মেথডের নামের একটি সেট সংজ্ঞায়িত করে — এটি নির্দিষ্ট করে একটি ক্লাসকে কী করতে পারতে হবে, কীভাবে সে বিষয়ে কোনো বিস্তারিত ছাড়াই:
<?php
interface Payable {
public function pay($amount);
}
class CreditCard implements Payable {
public function pay($amount) {
echo "Charged $amount to credit card.";
}
}
class Cash implements Payable {
public function pay($amount) {
echo "Received $amount in cash.";
}
}
function checkout(Payable $method, $amount) {
$method->pay($amount); // works with any Payable, regardless of exact class
}
checkout(new CreditCard(), 500);
checkout(new Cash(), 500);
?>checkout() জানে না বা পাত্তা দেয় না যে এটি একটি CreditCard নাকি একটি Cash অবজেক্ট পেয়েছে — শুধু জানে যে যা পেয়েছে তা Payable ইন্টারফেস মেনে চলে। এটাই ব্যবহারিক লাভ: একবার লেখা কোড পরে নতুন পেমেন্ট টাইপ যোগ হলেও সঠিকভাবে কাজ করতে থাকে।
একটি অ্যাবস্ট্র্যাক্ট ক্লাস এমন একটি ক্লাস যা সরাসরি instantiate করা যায় না — এটি শুধু extend হওয়ার জন্যই থাকে, আর সম্পূর্ণ-লেখা মেথডের সাথে অ্যাবস্ট্র্যাক্ট মেথড (কোনো body ছাড়া একটি মেথড সিগনেচার, যা প্রতিটি সাবক্লাসকে পূরণ করতে হয়) মেশাতে পারে:
<?php
abstract class Shape {
abstract public function area(); // every subclass must define this
public function describe() { // shared by every subclass, as-is
return "This shape has an area of " . $this->area();
}
}
class Circle extends Shape {
public function __construct(private $radius) {}
public function area() {
return round(pi() * $this->radius ** 2, 2);
}
}
$circle = new Circle(5);
echo $circle->describe(); // "This shape has an area of 78.54"
// new Shape(); // Error — cannot instantiate an abstract class
?>| আসল মেথড কোড থাকতে পারে? | একটি ক্লাস কতগুলো ব্যবহার করতে পারে? | কখন ব্যবহার করবেন | |
|---|---|---|---|
| ইন্টারফেস | না (শুধু মেথড সিগনেচার) | একসাথে একাধিক | অসম্পর্কিত ক্লাসগুলোর একই ক্ষমতা থাকার নিশ্চয়তা প্রয়োজন |
| অ্যাবস্ট্র্যাক্ট ক্লাস | হ্যাঁ, অ্যাবস্ট্র্যাক্ট মেথডের সাথে মেশানো | একটি | সম্পর্কিত ক্লাসগুলোর আসল, সাধারণ আচরণ শেয়ার করা উচিত |