অবজেক্ট অরিয়েন্টেড পিএইচপি (PHP OOP) হলো PHP প্রোগ্রামিং ভাষার একটি পদ্ধতি যেখানে কোডিং ধারণাটি অবজেক্ট এবং ক্লাস ভিত্তিক হয়ে থাকে। এটি প্রোগ্রামিংয়ের জন্য একটি নতুন এবং উন্নত পদ্ধতি যেখানে কোডকে মডুলার, পুনঃব্যবহারযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করা যায়। OOP কনসেপ্টগুলি বাস্তব জীবনের অবজেক্টগুলির মতো চিন্তা করে, যেমন গাড়ি, মানুষ, বই ইত্যাদি, যেখানে প্রত্যেকটি অবজেক্টের কিছু অ্যাট্রিবিউট এবং মেথড থাকতে পারে।
PHP OOP এর প্রধান বৈশিষ্ট্য
- ক্লাস (Class): ক্লাস হল একটি ব্লুপ্রিন্ট যা অবজেক্ট তৈরি করার জন্য ব্যবহৃত হয়। এটি অবজেক্টের স্টেট (অ্যাট্রিবিউট) এবং আচরণ (মেথড) সংজ্ঞায়িত করে।
- অবজেক্ট (Object): ক্লাস থেকে তৈরি একটি বাস্তব উদাহরণ। অবজেক্টটি ক্লাসের ধরণের অনুসারে একটি ইনস্ট্যান্স হিসেবে কাজ করে।
- ইনক্যাপসুলেশন (Encapsulation): এটি তথ্য লুকানোর প্রক্রিয়া, যেখানে ডেটা এবং এর সংশ্লিষ্ট মেথডগুলো একসাথে ক্লাসের মধ্যে রাখা হয়। এটি অবজেক্টের অভ্যন্তরীণ বাস্তবায়ন বাইরে থেকে গোপন রাখে।
- এনহেরিট্যান্স (Inheritance): একটি ক্লাস অন্য একটি ক্লাসের গুণাবলী (অ্যাট্রিবিউট এবং মেথড) উত্তরাধিকারসূত্রে লাভ করতে পারে। এটি কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে।
- পলিমরফিজম (Polymorphism): একাধিক ফাংশন বা মেথডের নাম একই থাকলেও তারা বিভিন্নভাবে কাজ করতে পারে, যা কোডের উন্নতি ঘটায়।
- এ্যাবস্ট্রাকশন (Abstraction): অবজেক্টের এক বা একাধিক ফাংশনের ইমপ্লিমেন্টেশন গোপন রাখা এবং শুধুমাত্র গুরুত্বপূর্ণ অংশ প্রদর্শন করা।
PHP OOP এর উদাহরণ
১. ক্লাস এবং অবজেক্ট তৈরি করা
color = $color;
$this->model = $model;
}
// মেথড
public function getCarDetails() {
return "This car is a " . $this->color . " " . $this->model;
}
}
// অবজেক্ট তৈরি
$myCar = new Car("Red", "Toyota");
// মেথড কল
echo $myCar->getCarDetails(); // Output: This car is a Red Toyota
?>
২. ইনক্যাপসুলেশন (Encapsulation)
balance = $balance;
}
// Getter method
public function getBalance() {
return $this->balance;
}
// Setter method
public function deposit($amount) {
$this->balance += $amount;
}
// Withdraw method
public function withdraw($amount) {
if ($this->balance >= $amount) {
$this->balance -= $amount;
} else {
echo "Insufficient funds!";
}
}
}
$account = new BankAccount(1000);
$account->deposit(500);
echo $account->getBalance(); // Output: 1500
$account->withdraw(200);
echo $account->getBalance(); // Output: 1300
?>
৩. এনহেরিট্যান্স (Inheritance)
name = $name;
}
public function speak() {
echo $this->name . " makes a sound.
";
}
}
// Child class
class Dog extends Animal {
public function speak() {
echo $this->name . " barks.
";
}
}
$dog = new Dog("Buddy");
$dog->speak(); // Output: Buddy barks.
?>
এখানে, Dog ক্লাসটি Animal ক্লাস থেকে inherit করেছে এবং speak() মেথডটি Dog ক্লাসে কাস্টমাইজ করেছে।
৪. পলিমরফিজম (Polymorphism)
";
}
}
class Circle extends Shape {
public function draw() {
echo "Drawing a circle
";
}
}
class Square extends Shape {
public function draw() {
echo "Drawing a square
";
}
}
$circle = new Circle();
$square = new Square();
$circle->draw(); // Output: Drawing a circle
$square->draw(); // Output: Drawing a square
?>
এখানে, draw() মেথডটি Shape, Circle এবং Square ক্লাসে রয়েছে এবং প্রতিটি ক্লাসে আলাদা আলাদা কাজ করছে। এটি পলিমরফিজমের উদাহরণ।
৫. অ্যাবস্ট্রাকশন (Abstraction)
";
}
}
class Dog extends Animal {
public function sound() {
echo "Woof
";
}
}
$dog = new Dog();
$dog->sound(); // Output: Woof
$dog->move(); // Output: This animal moves.
?>
এখানে, Animal ক্লাসটি একটি abstract class যা sound() মেথড ডিফাইন করে, কিন্তু তা বাস্তবায়ন (implementation) করেনি। Dog ক্লাসটি sound() মেথডের বাস্তবায়ন করেছে।
PHP OOP Concepts-এর সুবিধা:
- Code Reusability: OOP কোডের পুনঃব্যবহারযোগ্যতা বাড়ায়। ক্লাস এবং অবজেক্টের মাধ্যমে আপনি একবার লিখে বারবার ব্যবহার করতে পারেন।
- Modularity: কোডকে মডুলার আর্কিটেকচারে বিভক্ত করার মাধ্যমে এটি আরও পরিষ্কার এবং সুষ্ঠু হয়।
- Maintainability: কোড রক্ষণাবেক্ষণ সহজ হয়ে ওঠে, কারণ এটি মডিউলভিত্তিক এবং প্রোগ্রামের অংশগুলো একে অপর থেকে আলাদা থাকে।
- Flexibility: OOP ক্লাস এবং অবজেক্টের মাধ্যমে অ্যাপ্লিকেশনটিকে আরও নমনীয় এবং কাস্টমাইজযোগ্য করে তোলে।
- Security: ইনক্যাপসুলেশনের মাধ্যমে ডেটা সুরক্ষা নিশ্চিত করা যায়।
PHP OOP (Object-Oriented Programming) একটি শক্তিশালী প্রোগ্রামিং ধারণা যা আপনার কোডকে আরও দক্ষ, মডুলার এবং রক্ষণাবেক্ষণযোগ্য করে তোলে। এটি অ্যাবস্ট্রাকশন, ইনক্যাপসুলেশন, এনহেরিট্যান্স এবং পলিমরফিজমের মতো শক্তিশালী বৈশিষ্ট্য নিয়ে আসে যা আপনার অ্যাপ্লিকেশনটির আর্কিটেকচার উন্নত করতে সহায়তা করে। PHP OOP ব্যবহার করে আপনি কোডের গুণগত মান বৃদ্ধি করতে পারেন এবং বড় প্রকল্পগুলির জন্য আরও স্কেলেবল কোড তৈরি করতে পারেন।
অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং(OOP) এমন একটি প্রোগ্রামিং কৌশল যা রীতি অনুযায়ী একটি নির্দিষ্ট টপিক্স এর সকল ভ্যারিয়েবল এবং ফাংশনকে একটি একক ক্লাস এর মধ্যে দলবদ্ধ করে।
প্রসিডিউরাল স্টাইল প্রোগ্রামিং এর তুলনায় অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং কৌশলকে অধিক উন্নত এবং কার্যকরী প্রোগ্রামিং ভাষা হিসাবে বিবেচনা করা হয়। কারণ এটি
- অধিক সুসংগঠিত কোড স্টাইল সমর্থন করে
- কোড মডুউলারিটি(modularity) সরবরাহ করে
- কোড এর পুনরাবৃত্তি কমায় এবং কোড পুনঃব্যবহারযোগ্য করে তুলে
আপনি এই কৌশল ব্যবহার করে সহজেই জটিল, মডুলার(modular) এবং পুনঃব্যবহারযোগ্য ওয়েব অ্যাপ্লিকেশন তৈরি করতে পারবেন। এটি পিএইচপি ভার্সন-৫ থেকে পিএইচপিতে সংযোজিত হয়েছে।
বিঃদ্রঃ উপরোল্লিখিত এত সুবিধা সত্ত্বেও ছোট এবং সাধারণ প্রজেক্ট এর জন্য আমরা আপনাকে প্রসিডিউরাল প্রোগ্রামিং স্টাইল ব্যবহার করার সুপারিশ করছি।
যাইহোক যদি এমন হয় যে, আপনার প্রজেক্টের আকার দিন দিন বাড়তে থাকবে তাহলে অবজেক্ট অরিয়েন্টেড স্টাইল ব্যবহার করাই উত্তম হবে।
পিএইচপি OOP
OOP এর পূর্ণরূপ হলঃ Object-Oriented Programming। OOP তে সবকিছুই অবজেক্ট। যেমন- আপনি আমাদের এই বিশ্বকে নিয়ে কল্পনা করতে পারেন যা চাঁদ, সূর্য, পৃথিবী ইত্যাদি অবজেক্ট নিয়ে গঠিত।
একইভাবে, আপনি একটি গাড়ি কল্পনা করতে পারেন যা চাকা, গিয়ার, ইঞ্জিন ইত্যাদি অবজেক্ট নিয়ে গঠিত।
অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর ধারণাও অনেকটা পথিবী এবং গাড়ির মতই। এটি সবকিছুকেই অবজেক্ট হিসাবে বিবেচনা করে। আপনি এই অবজেক্ট সমূহ ব্যবহার করে বিভিন্ন অ্যাপ্লিকেশন তৈরি করতে পারেন।
পিএইচপির ভার্সন-৪ এ অবজেক্ট অরিয়েন্টেড বৈশিষ্ট্য না থাকলেও ভার্সন-৫ এ অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং কৌশল এর সম্পূর্ণ বৈশিষ্ট্য যুক্ত হয়েছে। পিএইচপিতে অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং ব্যবহার করে অনেক বৃহৎ ও জটিল ওয়েব অ্যাপ্লিকেশন তৈরি করা সম্ভব।
পিএইচপি OOP উদাহরণ
kt_satt_skill_example_id=564
অবজেক্ট অরিয়েন্টেডের গুরুত্বপূর্ণ বিষয় বস্তু
আমরা আমাদের টিউটোরিয়ালে অবজেক্ট অরিয়েন্টেডের নিম্নোক্ত বিষয় সমূহ নিয়ে আলোচনা করবোঃ
- PHP: Class - প্রোপার্টি(মেম্বার ভ্যারিয়েবল) এবং মেম্বার ফাংশন(মেথড) এর সমন্বয়ে অবজেক্ট তৈরির জন্য ক্লাস হলো সম্প্রসারণযোগ্য প্রোগ্রামিং কোড এর একটি নীল নকশা(templete)।
- PHP: Object - অবজেক্ট হলো ক্লাস এর একটি বিশেষ নিদর্শন(instance) যা ভ্যারিয়েবল, ফাংশন এবং ডেটা স্ট্রাকচার এর সমন্বয়ে গঠিত হতে পারে।
- PHP: Method - ক্লাস এর মেম্বার ফাংশনসমূহকে OOP তে মেথড বলা হয়। মেথড হলো অবজেক্ট-ক্লাস এর সাথে সম্পর্কিত একটি প্রক্রিয়া। একটি অবজেক্ট তথ্য এবং তথ্য প্রক্রিয়া এর সমন্বয়ে গঠিত হয়। "তথ্যকে" অবজেক্ট এর বৈশিষ্ট্য(property) এবং "তথ্য প্রক্রিয়াকে" মেথড এর মাধ্যমে প্রকাশ করা হয়। মেথড বাইরের অবজেক্ট এর সাথেও সম্পর্ক তৈরি করতে পারে।
- PHP: Property - ক্লাস এর মেম্বার ভ্যারিয়েবল।
- PHP: Encapsulation - প্রোপার্টি এবং মেথডসমূহ একত্রিত করে অবজেক্ট তৈরির একটি কৌশল।
- PHP: Inheritance - কোড ডুপ্লিকেশন কমানোর জন্য প্যারেন্ট ক্লাস এর প্রোপার্টি এবং মেথড চাইল্ড ক্লাসও ব্যবহার করতে পারে।
- PHP: Parent class - অন্য সকল ক্লাস এই ক্লাস কে ইনহেরিট করে। প্যারেন্ট ক্লাসের অপর নাম সুপার ক্লাস বা বেইজ ক্লাস।
- PHP: Child Class - এই ক্লাস অন্য সকল ক্লাসকে ইনহেরিট করে। এই ক্লাসের অপর নাম সাবক্লাস বা ডিরাইভ ক্লাস।
- PHP: Polymorphism - বিভিন্ন ক্লাসের যেসব মেথডসমূহ একই কাজে ব্যবহৃত হয় তাদের নামকরণ একই হওয়া।
- PHP: Overloading and Overriding - অভারলোডিং তখনই ঘটে যখন একই ক্লাসে দুই বা তার অধিক মেথড এর নাম একই কিন্তু প্যারামিটার ভিন্ন হয়। Overriding এর অর্থ হলো দুটি মেথডের নাম এবং প্যারামিটার(method signature) একই। একটি মেথড থাকে প্যারেন্ট ক্লাসে এবং অপরটি থাকে চাইল্ড ক্লাসে।
- PHP: abstract class and method - এটি একটি অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং পদ্ধতি। এই পদ্ধতিতে একজন প্রোগ্রামার প্রাসঙ্গিক তথ্য ছাড়া সকল কিছুই লুকিয়ে রাখতে পারে। যেমন- প্যারেন্ট ক্লাসের কিছু নির্দিষ্ট মেথডে চাইল্ড ক্লাস এক্সেস নিতে পারবে এমন অঙ্গীকার করার জন্য আমরা abstract class ব্যবহার করি। কিন্তু আমরা এই অঙ্গীকার করি না যে, মেথডের মধ্যে কি ধরণের কোড থাকবে।
- PHP: Interface - প্যারেন্ট ক্লাস চাইল্ড ক্লাসের সাথে এই অঙ্গীকার করে যে, মেথড বাস্তবায়নের জন্য চাইল্ড ক্লাস প্যারেন্ট ক্লাস এর abstract মেথডসমূহ এক্সেস করতে পারবে।
- PHP: public, private এবং protected প্রোপার্টি - প্রোপার্টিসমূহ public, private অথবা protected হতে পারে। public অর্থ প্রোপার্টিসমূহকে যেকোন স্থান থেকে এক্সেস করা যাবে, private অর্থ শুধুমাত্র সংশ্লিষ্ট ক্লাস থেকে এক্সেস করা যাবে এবং protected অর্থ হলো সংশ্লিষ্ট ক্লাস এবং এর চাইল্ড ক্লাস থেকেও এক্সেস করা যাবে।
- PHP: Public, Private এবং Protected মেথড - মেথডসমূহ public, private অথবা protected হতে পারে। public অর্থ মেথডসমূহকে যেকোন স্থান থেকে এক্সেস করা যাবে, private অর্থ শুধুমাত্র সংশ্লিষ্ট ক্লাস থেকে এক্সেস করা যাবে এবং protected অর্থ হলো সংশ্লিষ্ট ক্লাস এবং এর চাইল্ড ক্লাস থেকেও এক্সেস করা যাবে।
- PHP: Constructor - পিএইচপির বিশেষ ধরণের বিল্ট-ইন মেথড। অবজেক্ট তৈরির সময় প্রোপার্টির ভ্যালু এসাইনে সম্মতি দেয়। অবজেক্ট তৈরি হলে এই মেথডটি স্বয়ংক্রিয়ভাবেই সম্পাদিত হয়। দুটি আন্ডারস্কোর(__) দিয়ে
constructমেথড শুরু হয়। - PHP: Destructor - Constructor এর বিপরীত। অবজেক্ট ধ্বংশ হয়ে গেলে এটি স্বয়ংক্রিয়ভাবেই কল হয়।
- PHP: Type Hinting - ফাংশন ডিক্লেয়ারেশনের সময় আরগুমেন্ট এর জন্য প্রত্যাশিত ডেটা টাইপ( (arrays, objects, interface ইত্যাদি) নির্ধারণ করে দেওয়া হয়।
- PHP: Static property এবং method - নতুন অবজেক্ট তৈরি করা ছাড়াই ক্লাস এর প্রোপার্টি এবং মেথডকে এক্সেস করা যায়।
- PHP: Object Cloning - অবজেক্ট এর একটি কপি তৈরি করতে ক্লোনিং ব্যবহৃত হয়।
- PHP : spl_autoload_register() - প্রয়োজনীয় সকল ক্লাসকে সংশ্লিষ্ট ফাইলে স্বয়ংক্রিয়ভাবে লোড করে।
- PHP: scope Resolution Operator(::) - একটি
classএর static, constant এবং overridden প্রোপার্টি অথবা মেথডকে এক্সেস করতে পিএইচপি scope Resolution Operator(::) ব্যবহৃত হয়। - PHP: Magic Method
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),__set_state()এবং__clone()ফাংশনকে পিএইচপি ম্যাজিক মেথড বলা হয়।
চলুন দেরি না করে এখনি পিএইচপি অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং কৌশল শেখা শুরু করি।
Class প্রোগ্রামার-ডিফাইন্ড ডেটা টাইপ। যার মধ্যে লোকাল ডেটা এবং লোকাল ফাংশন থাকে। আপনি একটি class কে টেমপ্লেট হিসাবে ধরে একই ধরনের অনেক অবজেক্ট(instance of class) তৈরি করতে পারেন।
কিভাবে class তৈরি করবেন?
একটি class তৈরির জন্য অনেক গুলো কোড এর সমন্বয়ে একটি গ্রুপ অব কোড তৈরি করতে হবে যার মাধ্যমে আপনি একটি নির্দিষ্ট বিষয়কে হ্যান্ডেল বা পরিচালনা করতে পারবেন।
যেমন- একটি ব্লগ এর কথাই ধরুন। আপনি ব্লগের ইউজার সংক্রান্ত সকল কোড এর সমন্বয়ে একটি class, পোস্ট সম্পর্কিত সকল কোড এর সমন্বয়ে অন্য একটি class এবং কমেন্ট সম্পর্কিত সকল কোড এর সমন্বয়ে ভিন্ন আরেকটি class ক্লাস তৈরি করতে পারেন।
কোডের গ্রুপ নিয়ে class তৈরি করলে কোড শুধু পুনঃব্যবহারযোগ্যই হয় না, বরং কোডগুলো পরিচর্যা এবং পরিবর্তন করাও সহজ হয়ে যায়।
class নামকরণঃ একটি class এর নামকরন এর জন্য একটি একক নাম ব্যবহার করা হয়। Class এর নাম এর প্রথম বর্ণটি বড় হাতের হতে হয়।
উদাহরণস্বরূপঃ আমরা ব্লগের ইউজার নিয়ন্ত্রণ এর কোড গ্রুপ নিয়ে একটি User ক্লাস, পোস্ট নিয়ন্ত্রণের কোড গ্রুপ নিয়ে একটি Post ক্লাস এবং কমেন্ট এর কোড গ্রুপ নিয় একটি Comment ক্লাস তৈরি করতে পারি।
Class তৈরির সিনট্যাক্সঃ
kt_satt_skill_example_id=570
এখানে আমরা class কিওয়ার্ড এর মাধ্যমে ClassName নামে একটি ক্লাস ডিফাইন করেছি। class এর নামের প্রথম অক্ষরটি বড়-হাতের অক্ষরে লিখেছি এবং class নামে দুটি শব্দ থাকায় দুটি শব্দেরই প্রথম অক্ষর বড়-হাতের অক্ষরে লিখেছি। এই পদ্ধতিকে upper camel case বলে। class নামকরনের সময় একাধিক শব্দ ব্যবহার করলে আমরা এই পদ্ধতি ব্যবহার করবো।
class এ কিভাবে প্রোপার্টি যুক্ত করবেন?
আমরা একটি class এর মধ্যে ব্যবহৃত ভ্যারিয়েবল সমুহকে প্রোপার্টি বলে থাকি। প্রোপার্টিসমুহ অন্য যে কোনো ভ্যারিয়েবলের মতই স্ট্রিং, ইন্টিজার, বুলিয়ান(true অথবা false) টাইপের মান গ্রহণ করতে পারে।
নিম্নের উদাহরনে আমরা Greeting class এ দুটি প্রোপার্টি যুক্ত করবোঃ
kt_satt_skill_example_id=572
উপরের প্রোগ্রামে লক্ষ্য করলে দেখবেন, class এর মধ্যে প্রোপার্টি নামের পূর্বে public কিওয়ার্ড ব্যবহার করা হয়েছে। এটি ইউজারকে প্রোপার্টি এক্সেস এর ক্ষমতা প্রদান করে। public কিওয়ার্ড সম্মন্ধে আরও জানতে এক্সেস মোডিফায়ার অধ্যায় ভিজিট করুন।
class ভ্যারিয়েবলের নাম অন্যান্য ভ্যারিয়েবলের মতই ছোট-হাতের অক্ষর দিয়ে শুরু হয়। আর নামের মধ্যে যদি একাধিক শব্দ থাকে সেক্ষেত্রে প্রথম শব্দের প্রথম অক্ষরটি ছোট হাতের রেখে বাকী শব্দগুলোর জন্য আপনি camel case পদ্ধতি ব্যবহার করতে পারেন। যেমন- welcomeMsg।
ডিফল্ট ভ্যালুসহ অথবা ডিফল্ট ভ্যালু ছাড়াও প্রোপার্টি ডিফাইন্ড করা যায়। যেমন- উপরের উদাহরনে আমরা দুইটি প্রোপার্টি ডিফাইন করেছি। এদের মধ্যে একটির ডিফল্ট মান নির্ধারন করে দিয়েছি ($welcomeMsg = "Welcome Guest";) এবং অন্যটির ($message) ডিফল্ট মান নাই।
Class এ কিভাবে মেথড যুক্ত করবেন?
আমরা একটি class এর মধ্যে ব্যবহৃত ফাংশন সমুহকে মেথড বলে থাকি। মেথড সমুহ অন্য যে কোনো ফাংশনের মতই কাজ করে।
নিম্নের উদাহরণে আমরা Greeting class এ একটি মেথড যুক্ত করবোঃ
kt_satt_skill_example_id=574
উপরের উদাহরনে লক্ষ্য করলে দেখবেন, class এর মধ্যে message() নামে একটি মেথড ডিফাইন করা হয়েছে।
মেথড এর পূর্বে public কিওয়ার্ড ব্যবহার করা হয়েছে। এটি ইউজারকে প্রোপার্টি এক্সেস এর ক্ষমতা প্রদান করে। public কিওয়ার্ড সম্মন্ধে আরও জানতে এক্সেস মোডিফায়ার অধ্যায় ভিজিট করুন।
class ফাংশনের নাম অন্যান্য ফাংশনের মতই ছোট-হাতের অক্ষর দিয়ে শুরু হয়। নামের মধ্যে যদি একাধিক শব্দ থাকে তাহলে প্রথম শব্দের প্রথম অক্ষরটি ছোট হাতের রেখে বাকী শব্দগুলোর জন্য আপনি camel case পদ্ধতি ব্যবহার করতে পারেন। যেমন- welcomeMsg()।
class এর Object তৈরি
আমরা একটি class থেকে নিজস্ব কিছু প্রোপার্টি সম্পন্ন বিভিন্ন Object তৈরি করতে পারি।
Object তৈরির সিনট্যাক্সঃ
kt_satt_skill_example_id=575
Class এর Object তৈরি করতে আমরা সাধারণত new কিওয়ার্ড ব্যবহার করি। অবজেক্ট তৈরির এই প্রক্রিয়া আমাদের কাছে instantiation হিসাবেও বেশ পরিচিত।
আমরা একই class এর একাধিক Object তৈরি করতে পারিঃ
kt_satt_skill_example_id=576
kt_satt_skill_example_id=577
পরবর্তী অধ্যায়ে আমরা অবজেক্ট সম্মন্ধে আরও বিস্তারিত জানবো।
অবজেক্ট হলো class কর্তৃক সঙ্গায়িত ডেটা স্ট্রাকচার এর বিশেষ এক নিদর্শন(instance)। আপনি একটি ক্লাস(Class) একবার ডিফাইন করে এর অন্তর্গত অসংখ্য অবজেক্ট(Object) তৈরি করতে পারেন।
অবজেক্ট কি?
প্রসিডিউরাল(procedural) প্রোগ্রামিং স্টাইলে সকল ফাংশন এবং ভ্যারিয়েবলগুলো একত্রে গ্লোবাল স্কোপ((global scope) এর মধ্যে থাকে। এগুলোকে ব্যবহার করতে হলে শুধুমাত্র এদের নাম ধরে ডাকলেই হয়।
কিন্তু যখন আপনি ক্লাস ব্যবহার করবেন তখন ক্লাসের কোডসমুহ ক্লাসের বাইরের আলো বাতাস থেকে মুক্ত থাকে, অর্থাৎ অদৃশ্য অবস্থায় থাকে। তাই আপনি ক্লাসের কোডসমূহকে যখন-তখন অ্যাক্সেস করতে পারবেন না। কারণ ক্লাসের মধ্যে অবস্থিত কোডসমূহ ক্লাস স্কোপ দ্বারা এনক্যাপসুলেটেড(encapsulated) বা সুরক্ষিত হয়। এমতাবস্থায় ক্লাস এর কোডসমূহ অ্যাক্সেস করার একটি উপায় তো লাগবেই। আর এই উপায়টিই হলো ক্লাসের অবজেক্ট তৈরি।
আমরা একটি ক্লাস থেকে একাধিক অবজেক্ট তৈরি করতে পারি এবং অবজেক্টগুলো ক্লাসের প্রোপার্টি এবং মেথডসমূহকে অ্যাক্সেস(access) করতে পারে। ক্লাস থেকে তৈরি প্রতিটি অবজেক্ট একই প্রোপার্টি এবং মেথড ব্যবহার করলেও তাদের ভ্যালুসমূহ যথাক্রমে ভিন্ন হয়ে থাকে।
উপরের ছবিটি লক্ষ্য করুন, এখানে একটি ক্লাস থেকে কয়েকটি ভিন্ন মানের অবজেক্ট তৈরি করা হয়েছে।
অবজেক্টের মাধ্যমে প্রোপার্টি অ্যাক্সেস?
আপনি যদি ক্লাস এর প্রোপার্টিকে এক্সেস করতে চান তাহলে অবজেক্ট দ্বারা ঐ ক্লাসের অন্তর্গত প্রোপার্টি(property) গুলোকে অ্যাক্সেস করতে হবে। সুতরাং কোনো ক্লাস এর প্রোপার্টিকে অ্যাক্সেস করার জন্য প্রথমেই ঐ ক্লাসের একটি অবজেক্ট তৈরি করে নিতে হবে। তারপর ঐ অবজেক্টের নাম লিখে এবং এর ডানপাশে প্রোপার্টি এক্সেস(->) অপারেটর ব্যবহার করে প্রোপার্টি এক্সেস করা যাবে।
kt_satt_skill_example_id=578
সতর্কতাঃ ক্লাসের প্রোপার্টিকে অবজেক্টের মাধ্যমে অ্যাক্সেস করার সময় প্রোপার্টির নামের পূর্বে ডলার($) চিহ্ন ব্যবহার করে যাবে না!
অবজেক্টের মাধ্যমে প্রোপার্টি সেট?
আমরা অবজেক্টের মাধ্যমে একটি ক্লাসের প্রোপার্টির মান সেট করতে পারি। যে প্রক্রিয়ায় আমরা ক্লাস থেকে অবজেক্টের মাধ্যমে প্রোপার্টিকে অ্যাক্সেস করেছি ঠিক একই প্রক্রিয়ায় আমরা অবজেক্টের মাধ্যমে একটি ক্লাসের প্রোপার্টির ভ্যালুও সেট করতে পারি।
সুতরাং আমরা অবজেক্টের মাধ্যমে ক্লাস এর প্রোপার্টিকে অ্যাক্সেস করে এবং অ্যাসাইনমেন্ট(=) অপারেটর ব্যবহার করে ক্লাসের প্রোপার্টিতে ভ্যালু সেট করতে পারবোঃ
kt_satt_skill_example_id=579
সতর্কতাঃ ক্লাসের প্রোপার্টিকে অবজেক্টের মাধ্যমে অ্যাক্সেস করার সময় প্রোপার্টির নামের পূর্বে ডলার($) চিহ্ন দেওয়া যাবে না।
অবজেক্টের মাধ্যমে মেথড অ্যাক্সেস?
আমরা অবজেক্টের মাধ্যমে একটি ক্লাসের অন্তর্গত মেথডসমূহকে অ্যাক্সেস করতে পারি। প্রোপার্টি অ্যাক্সেস এর ন্যায় ক্লাস থেকে মেথড অ্যাক্সেস করার জন্যও প্রথমে আমরা ঐ ক্লাসের অবজেক্ট তৈরি করে নেব।
তারপর ঐ অবজেক্টের নাম লিখে এবং এর ডান পাশে প্রোপার্টি অ্যাক্সেস(->) অপারেটর ব্যবহার করে মেথডের নাম লিখে প্রথম বন্ধনী"()" ব্যবহার করবো।
অর্থাৎ যে প্রক্রিয়ায় আমরা একটি ফাংশনকে অ্যাক্সেস করি ঠিক একই প্রক্রিয়ায় আমরা অবজেক্টের মাধ্যমে একটি মেথডকেও অ্যাক্সেস করতে পারবোঃ
kt_satt_skill_example_id=580
OOP তে $this একটি বিশেষ ভ্যারিয়েবল। এটি একই অবজেক্টকে নির্দেশ করে। $this কীওয়ার্ড ব্যবহার করে আপনি একটি ক্লাসের প্রোপার্টি এবং মেথডসমুহকে ঐ ক্লাসের মধ্য থেকেই অ্যাক্সেস করতে পারবেন।
পিএইচপি OOP $this কীওয়ার্ড
$this কীওয়ার্ড আমাদেরকে এই নির্দেশনা দেয় যে, আমরা ক্লাস এর নিজস্ব প্রোপার্টি এবং মেথড ব্যবহার করতে যাচ্ছি এবং এটি আমাদেরকে ক্লাস স্কোপ থেকে এগুলো ব্যবহার/ অ্যাক্সেস করার সম্মতি দেয়।
শুধু্মাত্র
$thisকীওয়ার্ড ডলার($) চিহ্ন দ্বারা শুরু হয় অথচ প্রোপার্টি এবং মেথড এর নাম এটি দ্বারা শুরু হয় না।
নিম্নের সিন্ট্যাক্স ব্যবহার করে আমরা একটি ক্লাসের প্রোপার্টি এবং মেথডকে ক্লাসের মধ্য থেকে অ্যাক্সেস করবোঃ
kt_satt_skill_example_id=588
সতর্কতাঃ
$thisকীওয়ার্ড দ্বারা প্রোপার্টি অ্যাক্সেস করার সময় প্রোপার্টির নামের পূর্বে ডলার($) চিহ্ন ব্যবহার করা যাবে না।
নিম্নের উদাহরণে আমরা দেখবো $this কীওয়ার্ড ব্যবহার করে কিভাবে একটি প্রোপার্টিকে ঐ ক্লাসের একটি মেথডের মধ্য থেকে অ্যাক্সেস করা যায়ঃ
kt_satt_skill_example_id=589
এখন আমরা এই ক্লাসের দুইটি ভিন্ন অবজেক্ট তৈরি করবোঃ
kt_satt_skill_example_id=591
এখন আমরা ক্লাসের প্রোপার্টিতে মান সেট করবোঃ
kt_satt_skill_example_id=592
এখন আমরা প্রথম অবজেক্টের জন্য welcome() মেথডটির আউটপুট নিবঃ
kt_satt_skill_example_id=595
এখন আমরা দ্বিতীয় অবজেক্টের জন্য welcome() মেথডটির আউটপুট নিবঃ
kt_satt_skill_example_id=597
উপরের ব্যবহৃত সকল কোড নিম্নে একত্রে দেওয়া হলোঃ
kt_satt_skill_example_id=602
পরামর্শঃ আপনি একই পদ্ধতি ব্যবহার করে মেথডকে মেথডের মধ্যেও অ্যাক্সেস করতে পারবেন।
পিএইচপি OOP তে মেথড এবং প্রোপার্টি সমুহকে চেইনিং এর মাধ্যমে একই কমান্ডে কয়েকটি কার্য সম্পাদন করা যায়।
প্রোপার্টি এবং মেথড চেইনিং
পূর্ববর্তী অধ্যায়ে আমরা $this কীওয়ার্ড ব্যবহার করে ক্লাস স্কোপ থেকে প্রোপার্টি এবং মেথড অ্যাক্সেস করা শিখেছিলাম। এই অধ্যায়ে আমরা শিখবো, যখন কোনো মেথড $this কীওয়ার্ড রিটার্ন করে তখন ঐ ক্লাস এর মেথডসমূহ স্বয়ংক্রিয়ভাবে একটির সাথে অন্যটি যুক্ত হয়ে যায় অর্থাৎ চেইন সৃষ্টি হয়।
উদাহরণস্বরূপঃ নিম্নের Truck ক্লাসটি দেখুন। নিম্নের প্রোগ্রামটির মাধ্যমে একটি চলমান ট্রাকের টাঙ্কে কি পরিমান জ্বালানি আছে তা পরিমাপ করতে যাচ্ছি। এক্ষেত্রে জ্বালানির পরিমান দুটি প্যারামিটার এর উপর নির্ভরশীল। যথা- যাত্রা শুরুর সময় ট্রাকের টাঙ্কিতে কি পরিমান জ্বালানি লোড করা হয়েছিল এবং ট্রাকটি কয় মাইল পথ অতিক্রম করেছে।
জ্বালানির পরিমান নির্ণয়ের জন্য প্রথমেই আমরা Truck ক্লাসের মধ্যে একটি public প্রোপার্টি $fuelInTank ব্যবহার করবোঃ
kt_satt_skill_example_id=603
এইবার আমরা Truck ক্লাসে দুইটি মেথড যুক্ত করবো। প্রথম মেথড fuel() ট্রাকের টাঙ্কিতে জ্বালানির পরিমান গ্যালনে যুক্ত করবে। আর দ্বিতীয় মেথড totalRide() নির্দিষ্ট দুরত্ব অতিক্রম করার পর কি পরিমান জ্বালানি শেষ হয়েছে তা হিসাব করবে এবং ট্রাকের ট্রাঙ্কি থেকে এটি বিয়োগ করবে।
kt_satt_skill_example_id=604
যেহেতু আমরা আমাদের কোডগুলো অধিক স্বচ্ছ এবং মার্জিত আকারে চাই, তাই আমরা প্রোপার্টি এবং মেথড গুলো চেইনিং এর মাধ্যমে একত্রিত করবো। প্রোপার্টি বা মেথড চেইন এর জন্য ড্যাশ-এরো চিহ্ন ব্যবহৃত হয়ঃ
kt_satt_skill_example_id=605
কোড এর ব্যাখ্যাঃ ১০ গ্যালন জ্বালানিতে ৫০ মাইল ড্রাইভিং করার পর কি পরিমান জ্বালানি বাকি আছে তা বলে দিবে।
চেইন এর কাজ সম্পাদনের জন্য মেথডসমূহকে অবশ্যই অবজেক্ট রিটার্ন করতে হবে। আরা যেহেতু আমরা ক্লাস এর মধ্য থেকে অবজেক্ট ব্যবহার করতে চাচ্ছি, সুতরাং মেথডসমূহকে $this কীওয়ার্ড রিটার্ন করতে হবে।
নিচের কোডে লক্ষ্য করলে দেখবেন, চেইন এর কাজ সম্পন্ন করার জন্য কিভাবে প্রত্যেকটি মেথড থেকে অব্জেক্ট হিসাবে $this কিওয়াডকে রিটার্ন করানো হয়েছে।
kt_satt_skill_example_id=606
এখন আমরা Truck ক্লাসটির একটি অবজেক্ট তৈরি করবো এবং দেখবো ট্রাকটি ১০ গ্যালন তৈলে ৫০ মাইল যাওয়ার পর আর কি পরিমান তৈল বাকি আছে।
kt_satt_skill_example_id=607
kt_satt_skill_example_id=608
ক্লাসের মধ্যে প্রোপার্টি এবং মেথড থাকে। আর এই প্রোপার্টি এবং মেথড সমূহের তথ্যকে ক্লাসের বাইরে থেকে অ্যাক্সেস করার জন্য আমরা অ্যাক্সেস মডিফায়ার(access modifier) ব্যবহার করবো।
কেন অ্যাক্সেস মডিফায়ার ব্যবহার করবেন?
একটি ক্লাসের অন্তর্গত প্রোপার্টি এবং মেথডসমুহ ক্লাসের বাইরে থেকে অ্যাক্সেস করার অনুমতি আছে কিনা তা নির্ধারন করার জন্য অ্যাক্সেস মডিফায়ার ব্যবহার করা হয়। এটি অতিব প্রয়োজনীয়। কারন, আপনার প্রোগ্রামের তথ্য কোডসমুহ কে/কারা অ্যাক্সেস করতে পারবে তা আপনাকেই নির্ধারন করে দিতে হবে।
অ্যাক্সেস মডিফায়ার তিন ধরনের হয়। যথাঃ
- public
- private
- protected
আমরা নিম্নে এগুলো সম্পর্কে বিস্তারিত আলোচনা করবোঃ
public অ্যাক্সেস মডিফায়ার
পূর্ববর্তী অধ্যায়ে আমরা এই অ্যাক্সেস মডিফায়ারটি অনেকবার ব্যবহার করেছি। আমরা যে সকল প্রোপার্টি এবং মেথডের পূর্বে public কীওয়ার্ড ব্যবহার করবো ঐ সকল প্রোপার্টি এবং মেথড সমুহকে ক্লাসের বাইরে থেকে যে কেউ অ্যাক্সেস করতে পারবে। নিম্নের উদাহরণটি লক্ষ্য করলেই বুঝতে পারবেনঃ
kt_satt_skill_example_id=613
উপরের উদাহরণে $name প্রোপার্টি এবং hello() মেথড এর পূর্বে public কীওয়ার্ড ব্যবহারের ফলে এগুলোকে ক্লাসের বাইরে থেকে অ্যাক্সেস করা সম্ভব হয়েছে।
private অ্যাক্সেস মডিফায়ার
আমরা একটি ক্লাসের অন্তর্গত প্রোপার্টি এবং মেথডসমূহকে ক্লাসের বাইরে থেকে অ্যাক্সেস রোধ করতে পারি। এটি করার জন্য আমরা প্রোপার্টি এবং মেথড ঘোষণা করার সময় public কীওয়ার্ডের পরিবর্তে private কীওয়ার্ড ব্যবহার করবো।
নিম্নের উদাহরণে আমরা $name ভ্যারিয়েবলে public কীওয়ার্ড এর পরিবর্তে private কীওয়ার্ড ব্যবহার করেছিঃ
kt_satt_skill_example_id=616
$name প্রোপার্টির অ্যাক্সেস মডিফায়ার private হওয়ায় এটিকে আর ক্লাসের বাইরে থেকে অ্যাক্সেস করা সম্ভব না। এটি করার কারণেই একটি error পাওয়া গেছে।
Private প্রোপার্টিকে কিভাবে অ্যাক্সেস করবেন?
উপরের উদাহরণে আমরা দেখলাম, private প্রোপার্টিকে ক্লাসের বাইরে থেকে অ্যাক্সেস করার সময় একটি error উৎপন্ন হয়েছে। কিন্তু আমরা কোনো ধরণের error ছাড়াই private প্রোপার্টিকে অ্যাক্সেস করতে চাই।
Private প্রোপার্টিকে অ্যাক্সেস করার জন্য আমরা ক্লাস এর মধ্যে একটি public মেথড ব্যবহার করবো। কারন, public মেথডকে ক্লাসের বাইরে থেকেও অ্যাক্সেস করা যায়।
একটি ক্লাসে public মেথড সাধারনত দুই ধরনের হয়ে থাকেঃ
- Setters: private প্রোপার্টির মান সেট করে।
- Getters: private প্রোপার্টির মান আউটপুট দেয়।
নিম্নের উদাহরণে আমরা public মেথড setName() এর মাধ্যমে private প্রোপার্টি $name এর মান সেট করবো এবং getHello() এর মাধ্যমে সেটকৃত মান এর আউটপুট পাবোঃ
kt_satt_skill_example_id=618
নোটঃ private অ্যাক্সেস মডিফায়ার ব্যবহার করে আমরা একটি মেথড বা প্রোপার্টিকে ক্লাসের বাইরে থেকে সরাসরি অ্যাক্সেস করা থেকে রোধ করতে পারি।
protected অ্যাক্সেস মডিফায়ার
protected মডিফায়ারকেও সরাসরি ক্লাসের বাইরে থেকে অ্যাক্সেস করা যায় না। সরাসরি অ্যাক্সেস করতে চাইলে এটি একটি error তৈরি করে। নিম্নের উদাহরণটি লক্ষ্য করুনঃ
kt_satt_skill_example_id=621
আমরা protected অ্যাক্সেস মডিফায়ার সম্পর্কে পরবর্তীতে আলোচনা করবো।
অবজেক্ট অরিয়েন্টেড পিএইচপিতে ম্যাজিক মেথড(method) এবং কনস্ট্যান্ট(constant) ব্যবহার করে খুব সামান্য কোড লিখেই অনেক বেশী কার্য সম্পাদন করা সম্ভব এবং এটি কোডের কার্যক্ষমতা এবং স্বচ্ছতার মাত্রাও অনেক বাড়িয়ে দেয়।
ম্যাজিক মেথড এর ব্যবহার সম্পর্কে অনেক বিতর্ক রয়েছে, তাই আমাদের এই টিউটোরিয়ালে আমরা অধিক সম্মত অংশগুলো নিয়ে আলোচনা করবো।
__construct() ম্যাজিক মেথড
ম্যাজিক মেথডগুলো সবসময় দুটি আন্ডারস্কোর দিয়ে শুরু হয়। এমনকি __construct() ম্যাজিক মেথডের ক্ষেত্রেও এই একই নিয়ম প্রযোজ্য।
আমরা কোন ক্লাসের অবজেক্ট তৈরির সময় __construct() ম্যাজিক মেথড ব্যবহার করে স্বয়ংক্রিয়ভাবে কিছু কার্য সম্পাদন করতে পারি। আমারা সাধারনত ক্লাসের প্রোপার্টির মান সেট করার জন্য __construct() ম্যাজিক মেথডটি ব্যবহার করি।
নিম্নের উদাহরণে আমরা __construct() মেথড ব্যবহার করে ক্লাসের প্রোপার্টির মান সেট করবোঃ
kt_satt_skill_example_id=625
কন্সট্রাকটর মেথড ব্যবহার করলে অবজেক্ট তৈরির সময় ক্লাস এর মধ্য দিয়ে কমপক্ষে একটি বা প্রয়োজন অনুযায়ী আর্গুমেন্ট পাস করাতে হবে। কিন্তু আমরা যদি কন্সট্রাকটর মেথডকে কোনো গুরুত্ব না দিয়েই নতুন অবজেক্ট তৈরির চেষ্টা করি তাহলে একটি error এর সম্মূখীন হতে হবেঃ
kt_satt_skill_example_id=627
এই ধরনের error সমুহকে এড়িয়ে যাওয়ার জন্য আমরা কন্সট্রাকটর মেথডে একটি মান নির্ধারন করে দিতে পারি। অবজেক্ট তৈরি করার সময় কন্সট্রাকটর মেথডে মান সেট করার জন্য আমরা নিম্নের ন্যায় প্রথম বন্ধনির মধ্যে মান ঠিক করে দিবঃ
kt_satt_skill_example_id=629
এখন আমরা একটি মেথড তৈরি করবো যার মাধ্যমে আমরা $name প্রোপার্টির ভ্যালু আউটপুট নিবঃ
kt_satt_skill_example_id=630
কোনো ঝুঁকি ছাড়াই কিভাবে কন্সট্রাকটর মেথড লিখবেন?
উপরের উদাহরণে আমরা দেখেছি কন্সট্রাকটর মেথড ব্যবহার করে ক্লাসের অবজেক্ট তৈরি করার সময় ক্লাসের মধ্য দিয়ে আর্গুমেন্ট অতিক্রম করাতে হয়, অন্যথায় একটি error এর সম্মুখীন হতে হবে।
এই error টিকে এড়ানোর জন্য আমরা প্রোপার্টিতে একটি ডিফল্ট মান নির্ধারন করে দিব। প্রোপার্টির জন্য ডিফল্ট মানগুলো ফাঁকা স্ট্রিং অথবা স্ট্রিং অথবা শূন্য অথবা নাল ভ্যালু হতে পারে।
আমাদের প্রোগ্রামে আমরা ডিফল্ট ভ্যালু হিসাবে "Guest" ব্যবহার করবো। নিম্নের উদাহরণটি লক্ষ্য করুনঃ
আমরা $name প্রোপার্টিতে কোন মান পাস করানো ছাড়া একটি অবজেক্ট তৈরি করা সত্ত্বেও কোনো error দেখাবে না। কারন কন্সট্রাকটর মেথডের ডিফল্ট মান "NULL"।
kt_satt_skill_example_id=632
চলুন দেখি উপরের উদাহরণে একটি মান পাস করলে কি ঘটেঃ
kt_satt_skill_example_id=633
এক্ষেত্রে আমাদের দেওয়া মানটি আউটপুট হিসাবে দেখিয়েছে। সুতরাং উপরোক্ত পদ্ধতি অবলম্বন করে আমরা ম্যাজিক কন্সট্রাকটর ব্যবহার করতে পারি।
ম্যাজিক কনস্ট্যান্ট(constant)
ম্যাজিক মেথড ছাড়াও পিএইচপিতে আরো কিছু মজার কনস্ট্যান্ট রয়েছে। যেগুলো ব্যবহার করে আমরা নির্দিষ্ট কার্য সম্পাদন করতে পারি।
উদাহরণস্বরূপঃ আমরা একটি কনস্ট্যান্ট __CLASS__ ব্যবহার করতে পারি। পিএইচপিতে কনস্ট্যান্ট প্রকাশ এর জন্য প্রথমে দুইটি আন্ডারস্কোর, এরপরে কন্সট্যান্ট এর সবগুলো অক্ষর বড়-হাতের তারপরে আবার দুইটি আন্ডারস্কোর লিখতে হয়। __CLASS__ কনস্ট্যান্ট যে ক্লাসে ব্যবহার করা হয় এটি ঐ ক্লাসের নাম রিটার্ন করে।
kt_satt_skill_example_id=634
এছাড়া আরো কিছু ম্যাজিক কনস্ট্যান্ট রয়েছে যা আমরা ব্যবহার করতে পারিঃ
- __LINE__: লাইনের নাম্বার/অবস্থান আউটপুট দেয়।
- __FILE__: ফাইলে নাম এবং পাথ আউটপুট দেয়।
- __METHOD__: মেথডের নাম আউটপুট দেয়।
অবজেক্ট অরিয়েন্টেড পিএইচপির আরো একটি বড় সুবিধা হলো কোড ইনহেরিটেন্স(inheritance)। অর্থাৎ একটি ক্লাস তার উত্তরাধিকার বা চাইল্ড ক্লাস এর সাথে কোড ডুপ্লিকেশনের ক্ষমতা রাখে।
উদাহরণস্বরূপঃ সন্তান যেমন পিতা-মাতার সম্পত্তির মালিক হয়। আরো সহজ করে বললেঃ সন্তান যেমন পিতা-মাতার সম্পত্তি ব্যবহার করতে পারে ঠিক তেমনি একটি চাইল্ড ক্লাস তার প্যারেন্ট ক্লাসের সকল প্রোপার্টি এবং মেথড সমুহকে অ্যাক্সেস করতে পারে। এক্ষেত্রে আমরা প্যারেন্ট ক্লাসে কোড গুলো একবার লিখে চাইল্ড ক্লাস থেকে যতবার ইচ্ছা ব্যবহার করতে পারি। এটি প্রোগ্রামের মডুলারিটি(modularity) অনেক বাড়িয়ে দেয়।
চাইল্ড ক্লাস তৈরি
আমরা কোনো কোড প্যারেন্ট ক্লাসে একবার লিখে ইনহেরিটেন্স(inheritance) ব্যবহার করে ঐ কোডকে প্যারেন্ট এবং চাইল্ড উভই ক্লাস থেকেই ব্যবহার করতে পারবো।
একটি প্যারেন্ট ক্লাসের চাইল্ড ক্লাস তৈরি করার জন্য extends কীওয়ার্ড ব্যবহার করা হয়।
চাইল্ড ক্লাস তৈরির সিনট্যাক্স
নিম্নে চাইল্ড ক্লাস তৈরির সিনট্যাক্স দেখানো হলোঃ
kt_satt_skill_example_id=648
একটি চাইল্ড ক্লাস তার প্যারেন্ট ক্লাসের সকল non-private মেথড এবং প্রোপার্টিসমূহ অ্যাক্সেস করতে পারে।
kt_satt_skill_example_id=650
উদাহরণের ব্যাখ্যা
- উপরের উদাহরণে প্রথমে Greeting ক্লাস তৈরি করা হয়েছে।
- Greeting ক্লাস এর একটি চাইল্ড ক্লাস Hello তৈরি করা হয়েছে।
- Hello ক্লাস এর একটি অব্জেক্ট hello তৈরি করা হয়েছে।
বিঃদ্রঃ Greeting ক্লাসের private ব্যাতিত সকল মেথড এবং প্রোপার্টিসমূহ Hello ক্লাসের মাধ্যমে ব্যবহার করা যাবে। __construct() এবং getHello() মেথড এর স্কোপ পাবলিক হওয়ায় প্যারেন্ট ক্লাসে থাকা সত্ত্বেও প্যারেন্ট এবং চাইল্ড উভয় ক্লাস থেকেই অ্যাক্সেস করা যাবে।
চাইল্ড ক্লাসের নিজস্ব প্রোপার্টি এবং মেথড
একটি চাইল্ড ক্লাস যে শুধুমাত্র প্যারেন্ট ক্লাসের প্রোপার্টি এবং মেথড ব্যবহার করে তা নয়। বরং একটি চাইল্ড ক্লাসেরও কিছু নিজস্ব প্রোপার্টি এবং মেথড থাকতে পারে। একটি চাইল্ড ক্লাস প্যারেন্ট ক্লাসের সকল প্রোপার্টি এবং মেথড ব্যবহার করতে পারলেও প্যারেন্ট ক্লাস কখনোই চাইল্ড ক্লাসের প্রোপার্টি এবং মেথড ব্যবহার করতে পারে না।
নিম্নের উদাহরণে আমরা চাইল্ড ক্লাসের মধ্যে একটি প্রোপার্টি এবং একটি মেথড ডিফাইন করবোঃ
kt_satt_skill_example_id=651
protected অ্যাক্সেস মডিফায়ার
আমরা যেকোনো প্রোপার্টি অথবা মেথডকে protected ঘোষনা করতে পারি। এই পদ্ধতি অবলম্বন করে আমরা প্যারেন্ট ক্লাসের প্রোপার্টি এবং মেথডসমূহকে প্যারেন্ট এবং চাইল্ড উভয় ক্লাস থেকেই অ্যাক্সেস করতে পারি।
পূর্ববর্তী অধ্যায়ে আমরা দেখেছিলাম, public কীওয়ার্ড ব্যবহার করে কিভাবে প্রোপার্টি এবং মেথড সমুহকে ক্লাসের ভিতরে এবং বাইরে থেকে অ্যাক্সেস করা যায় এবং private কীওয়ার্ড ব্যবহার করে কিভাবে ক্লাসের অভন্তরেই প্রোপার্টি এবং মেথডসমুহকে অ্যাক্সেস করতে হয়।
এই টিউটোরিয়ালে আমরা তৃতীয় একটি মডিফায়ার অর্থাৎ protected মডিফায়ার সম্পর্কে জানবো। যা প্যারেন্ট এবং চাইল্ড উভয় ক্লাসের মধ্যে অ্যাক্সেস যোগ্য। কিন্তু ক্লাসের বাইরে থেকে এটিকে অ্যাক্সেস করা সম্ভব নয়।
উপরের উদাহরণে আমরা $name প্রোপার্টিকে private ডিক্লেয়ার করেছিলাম। চলুন দেখাযাক, এই প্রোপার্টিকে চাইল্ড ক্লাস থেকে অ্যাক্সেস করলে কি ঘটেঃ
kt_satt_skill_example_id=653
আমরা একটি error এর সম্মুখীন হলাম। কারণ $name একটি private প্রোপার্টি। তাই আমরা এটিকে চাইল্ড ক্লাস থেকে অ্যাক্সেস করতে পারবো না।
এই সমস্যাটি সমাধান করতে আমরা protected কীওয়ার্ড ব্যবহার করবো।
kt_satt_skill_example_id=655
এইবার এটি ঠিকমত কাজ করেছে। কারণ, প্যারেন্ট ক্লাসের protected প্রোপার্টি চাইল্ড ক্লাস থেকেও অ্যাক্সেস করা যায়।
চাইল্ড ক্লাস থেকে প্যারেন্ট ক্লাসের প্রোপার্টি এবং মেথড ওভার-রাইড
যে পদ্ধতিতে চাইল্ড ক্লাসের নিজস্ব প্রোপার্টি বা মেথডসমূহ ঘোষণা(declare) করা হয় ঠিক একই পদ্ধতিতে চাইল্ড ক্লাস থেকে প্যারেন্ট ক্লাসের প্রোপার্টি বা মেথডসমুহকে ওভার-রাইড করা হয়। প্যারেন্ট ক্লাসে ডিফাইনকৃত মেথড বা প্রোপার্টিকে চাইল্ড ক্লাসে ভিন্ন মান দ্বারা পূনরায় ডিফাইন করলেই এগুলো ওভার-রাইড(Override) হয়ে যাবে।
নিম্নের উদাহরণে আমরা প্যারেন্ট ক্লাসের getHello() মেথডকে চাইল্ড ক্লাসে ওভার-রাইড করবোঃ
kt_satt_skill_example_id=656
ফলাফল পরিবর্তন হয়ে গেছে। সুতরাং প্যারেন্ট ক্লাসের getHello() মেথডটি চাইল্ড ক্লাসে পরিবর্তন হয়ে গেছে।
চাইল্ড ক্লাসে প্যারেন্ট ক্লাসের প্রোপার্টি এবং মেথড ওভার-রাইড প্রতিরোধ
আমরা প্যারেন্ট ক্লাসের private ব্যাতিত সকল মেথড এবং প্রোপার্টিকে চাইল্ড ক্লাস থেকে অ্যাক্সেস এবং ওভার-রাইড(Override) বা পরিবর্তন করতে পারি। কিন্তু কিছু কিছু ক্ষেত্রে আপনি নিশ্চয় চাইবেন যেন প্যারেন্ট ক্লাসে তৈরি মেথড বা প্রোপার্টিসমূহকে এর চাইল্ড ক্লাস থেকে ওভার-রাইড করতে না পারে।
এটা সমাধানের জন্য আপনার প্যারেন্ট ক্লাসে ডিফাইনকৃত public বা protected মেথড এবং প্রোপার্টিসমুহের পূর্বে final কীওয়ার্ড যুক্ত করে দিন। যে সকল প্রোপার্টি বা মেথডের পূর্বে final কীওয়ার্ড থাকবে সেগুলোকে চাইল্ড ক্লাস থেকে আর ওভার-রাইড করা যাবে না।
নিম্নের উদাহরণে আমরা প্যারেন্ট ক্লাসের getHello() মেথডের পূর্বে final কীওয়ার্ড ব্যবহার করবোঃ
kt_satt_skill_example_id=657
প্যারেন্ট ক্লাসের getHello() মেথডের পূর্বে final কীওয়ার্ড ব্যবহার করায় এটি চাইল্ড ক্লাস থেকে ওভার-রাইড করা সম্ভব হয়নি এবং একটি error এর সম্মুখীন হতে হয়েছে।
এটি একটি অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং কৌশল। এই পদ্ধতিতে একজন প্রোগ্রামার প্রাসঙ্গিক তথ্য ছাড়া সব কিছুই লুকিয়ে রাখতে পারে। যেমন- প্যারেন্ট ক্লাসের কিছু নির্দিষ্ট মেথডে চাইল্ড ক্লাস এক্সেস নিতে পারবে এমন অঙ্গীকার করার জন্য আমরা abstract class ব্যবহার করি। কিন্তু আমরা এই অঙ্গীকার করি না যে, মেথডের মধ্যে কি ধরণের কোড থাকবে।
আরও স্পষ্ট করে বললেঃ আমরা অ্যাবস্ট্রাক্ট(abstract) ক্লাস এবং মেথড তখনই ব্যবহার করি যখন আমরা প্যারেন্ট ক্লাস এর কিছু মেথডকে চাইল্ড ক্লাস থেকে ইনহেরিট করতে বাধ্য করি।
অ্যাবস্ট্রাক্ট(abstract) ক্লাস এবং মেথড
- অ্যাবস্ট্রাক্ট(abstract) ক্লাস - অ্যাবস্ট্রাক্ট ক্লাসে কমপক্ষে একটি অ্যাবস্ট্রাক্ট মেথড থাকে। অ্যাবস্ট্রাক্ট ক্লাস থেকে আমরা কোনো অবজেক্ট তৈরি করতে পারি না, বরং এর পরিবর্তে অ্যাবস্ট্রাক্ট ক্লাসের চাইল্ড ক্লাস এর মধ্যে আমরা অ্যাবস্ট্রাক্ট মেথডসমুহকে ডিফাইন করবো এবং প্রয়োজন অনুযায়ী চাইল্ড ক্লাস এর অবজেক্ট তৈরি করবো।
- অ্যাবস্ট্রাক্ট(abstract) মেথড - অ্যাবস্ট্রাক্ট মেথড শুধুমাত্র অ্যাবস্ট্রাক্ট ক্লাসের মধ্যেই ব্যবহার করা যায়। অ্যাবস্ট্রাক্ট মেথডের মধ্যে কোনো কোড ডিফাইন করা থাকে না। শুধুমাত্র মেথডের নাম এবং আর্গুমেন্টসমূহ ডিক্লেয়ার করা থাকে। এই জন্য আমরা অ্যাবস্ট্রাক্ট ক্লাস থেকে কোনো অবজেক্ট তৈরি করতে পারি না।
অ্যাবস্ট্রাক্ট ক্লাস এবং মেথড ডিক্লেয়ার
অ্যাবস্ট্রাক্ট ক্লাস ডিক্লেয়ার করার জন্য আপনাকে নিম্নের মত abstract কীওয়ার্ড ব্যবহার করতে হবেঃ
kt_satt_skill_example_id=660
এখন আমরা অ্যাবস্ট্রাক্ট ক্লাসের মধ্যে একটি অ্যাবস্ট্রাক্ট মেথড তৈরি করবো। অ্যাবস্ট্রাক্ট মেথড তৈরি করার জন্য মেথডের নামের পূর্বে নিম্নের মত abstract কীওয়ার্ড ব্যবহার করতে হবেঃ
kt_satt_skill_example_id=661
সতর্কতাঃ অ্যাবস্ট্রাক্ট মেথড শুধুমাত্র অ্যাবস্ট্রাক্ট ক্লাসের মধ্যেই ডিক্লেয়ার করা যায়। অর্থাৎ কোনো ক্লাসের মধ্যে অ্যাবস্ট্রাক্ট মেথড ডিক্লেয়ার করার পূর্বে ঐ ক্লাসটিকে অবশ্যই অ্যাবস্ট্রাক্ট করে নিতে হবে।
এখন আমরা একটি অ্যাবস্ট্রাক্ট ক্লাস এবং মেথডের উদাহরণ দেখবোঃ
kt_satt_skill_example_id=663
একটি অ্যাবস্ট্রাক্ট ক্লাসে সাধারন মেথড থাকতে পারে কি?
হ্যাঁ, অবশ্যই। একটি অ্যাবস্ট্রাক্ট ক্লাসের মধ্যে সাধারন মেথড থাকতে পারে এবং সাধারন প্রোপার্টিও থাকতে পারে।
চলুন আমাদের উদাহরণে একটি protected প্রোপার্টি $tankValue এবং একটি public মেথড setTankValue() যুক্ত করিঃ
kt_satt_skill_example_id=664
কিভাবে অ্যাবস্ট্রাক্ট ক্লাসের চাইল্ড ক্লাস তৈরি করবেন?
যেহেতু অ্যাবস্ট্রাক্ট ক্লাসের কোনো অবজেক্ট তৈরি করা যায় না, তাই আমাদের একটি চাইল্ড ক্লাসের প্রয়োজন হবে যা অ্যাবস্ট্রাক্ট ক্লাস থেকে প্রোপার্টি এবং মেথড ইনহেরিট করতে পারবে। আমরা সাধারন ক্লাসের মতই extends কীওয়ার্ড ব্যবহার করে অ্যাবস্ট্রাক্ট ক্লাসেরও চাইল্ড ক্লাস তৈরি করতে পারি। কিন্ত অ্যাবস্ট্রাক্ট ক্লাসের চাইল্ড ক্লাসগুলো একটু ভিন্ন হয়। কারণ, অ্যাবস্ট্রাক্ট মেথডসমুহের কোড চাইল্ড ক্লাসে ডিফাইন করতে হয়।
চলুন Truck ক্লাস এর একটি চাইল্ড ক্লাস Toyota তৈরি করি যা উত্তরাধিকার সূত্রে অ্যাবস্ট্রাক্ট মেথড calcMiles() কে পায় এবং এতে প্রয়োজনীয় কোড ডিফাইন করিঃ
kt_satt_skill_example_id=665
এখন আমরা অ্যাবস্ট্রাক্ট ক্লাস Truck এর ভিন্ন একটি চাইল্ড ক্লাস তৈরি করবো এবং এখানেও অ্যাবস্ট্রাক্ট মেথড calcMiles() এ কোড ডিফাইন করবো। তবে এক্ষেত্রে গণনা একটু ভিন্ন হবে, কারণ এটি ভিন্ন একটি ট্রাক ক্লাসঃ
kt_satt_skill_example_id=666
এখন আমরা চাইল্ড ক্লাস গুলো থেকে অবজেক্ট তৈরি করবো এবং ফলাফল আউটপুট নিবঃ
kt_satt_skill_example_id=667
প্যারেন্ট ক্লাস চাইল্ড ক্লাসের সাথে এই অঙ্গীকার করে যে, মেথড বাস্তবায়নের জন্য চাইল্ড ক্লাস প্যারেন্ট ক্লাস এর abstract মেথডসমূহ এক্সেস করতে পারবে।
সুতরাং একটি ইন্টারফেস(interfaces) এর অ্যাবস্ট্রাক্ট মেথডসমুহকে তার অন্তর্ভুক্ত চাইল্ড ক্লাসে অবশ্যই বাস্তবায়ন করতে হবে। যখন অনেক প্রোগ্রামার একত্রে কাজ করে তখন এটির ব্যবহার অনেক সুবিধাজনক। কারণ, প্রোগ্রামাররা যে মেথডসমুহ নিয়ে নিয়ে কাজ করবে তা ইন্টারফেসে পূর্বে থেকেই নির্ধারণ করে দেওয়া থাকে।
কিভাবে ইন্টারফেস ডিক্লেয়ার করবেন?
আপনি interface কীওয়ার্ড ব্যবহার করে নিম্নের মত ইন্টারফেস ডিক্লেয়ার করতে পারেনঃ
kt_satt_skill_example_id=670
অ্যাবস্ট্রাক্ট মেথড এবং কনস্ট্যান্ট ব্যাতিত ইন্টারফেস অ্যাবস্ট্রাক্ট ক্লাসের মতই। ইন্টারফেসের মধ্যে কোনো প্রোপার্টি থাকে না, শুধুমাত্র public মেথড থাকে।
এখন আমরা Truck নামে একটি ইন্টারফেস ক্লাস তৈরি করবো যা সব ধরণের ট্রাক কে হ্যান্ডেল করবে এবং এটা নিশ্চিত করবে যে, এর সকল চাইল্ড ক্লাসে setTruckModel() এবং getTruckModel() মেথড এর বাস্তবায়ন ঘটাবেঃ
kt_satt_skill_example_id=671
কিভাবে চাইল্ড ক্লাসে ইন্টারফেস সংযুক্ত করবেন?
implements কীওয়ার্ড ব্যবহার করে চাইল্ড ক্লাসে ইন্টারফেস সংযুক্ত করতে হয়ঃ
kt_satt_skill_example_id=672
এখন আমরা TruckDetails নামে Truck ইন্টারফেসের একটি চাইল্ড ক্লাস তৈরি করবো এবং এতে Truck ইন্টারফেস থেকে ইনহেরিটকৃত প্যারামিটারসহ সকল মেথড ডিফাইন করবোঃ
kt_satt_skill_example_id=673
চাইল্ড ক্লাসে কি একাধিক ইন্টারফেস সংযুক্ত করা যায়?
হ্যাঁ, অবশ্যই। আমরা একটি চাইল্ড ক্লাসে অসংখ্য ইন্টারফেস সংযুক্ত করতে পারি। একটি ক্লাসে একাধিক ইন্টারফেস সংযুক্ত করার জন্য কমা(,) চিহ্ন ব্যবহার করে ইন্টারফেসসমূহক পৃথক করা হয়।
একাধিক ইন্টারফেস যুক্ত করার সিনট্যাক্স
kt_satt_skill_example_id=674
এখন আমরা ভিন্ন একটি ইন্টারফেস তৈরি করবো যাতে দুইটি মেথড ডিক্লেয়ার করবো। যথা- setHasWheels() যা বুলিয়ান মান ধারন করবে এবং getHasWheels() যা ট্রাক এর চাকা আছে কিনা আউটপুট দিবে।
kt_satt_skill_example_id=675
এখন আমাদের চাইল্ড ক্লাসে উপরের দুইটি ইন্টারফেস সংযুক্ত করবোঃ
kt_satt_skill_example_id=676
এখন আমরা চাইল্ড ক্লাস থেকে অবজেক্ট তৈরি করবো এবং ফলাফল আউটপুট নিবঃ
kt_satt_skill_example_id=677
ইন্টারফেস এবং অ্যাবস্ট্রাক্ট ক্লাসের মধ্যে পার্থক্য
আপনারা আমাদের এই টিউটোরিয়ালে নিশ্চয় লক্ষ্য করেছেন যে, ইন্টারফেস এবং অ্যাবস্ট্রাক্ট ক্লাসের মধ্যে অনেক মিল রয়েছে। যাইহোক, এদের মধ্যে বেশ কিছু পার্থক্যও বিদ্যমান। নিম্নে ইন্টারফেস এবং অ্যাবস্ট্রাক্ট ক্লাসের পার্থক্য তুলে ধরা হলোঃ
- ইন্টারফেসের মধ্যে অ্যাবস্ট্রাক্ট মেথড ও কনস্ট্যান্ট থাকে এবং কনক্রিট(concrete) ভ্যারিয়েবল এবং মেথড ধারন করে না, কিন্তু অ্যাবস্ট্রাক্ট ক্লাস অ্যাবস্ট্রাক্ট মেথড, কনস্ট্যান্ট, কনক্রিট(concrete) ভ্যারিয়েবল এবং মেথড ধারন করে।
- ইন্টারফেসে ক্লাসের সকল মেথড অবশ্যই public হতে হবে, কিন্তু অ্যাবস্ট্রাক্ট ক্লাস সকল অ্যাক্সেস মডিফায়ার সমর্থন করে।
- একটি চাইল্ড ক্লাস একাসাথে একাধিক ইন্টারফেস ব্যবহার করতে পারে, কিন্তু অ্যাবস্ট্রাক্ট ক্লাসের ক্ষেত্রে চাইল্ড ক্লাস একের অধিক অ্যাবস্ট্রাক্ট ক্লাস থেকে ইনহেরিট হতে পারে না।
নিম্নের টেবিলে পার্থক্য গুলো সারাশং আকারে দেখানো হলোঃ
| ইন্টারফেস | অ্যাবস্ট্রাক্ট ক্লাস | |
|---|---|---|
| কোড | অ্যাবস্ট্রাক্ট মেথড, কনস্ট্যান্ট | অ্যাবস্ট্রাক্ট মেথড, কনস্ট্যান্ট, কনক্রিট মেথড, কনক্রিট ভ্যারিয়েবল |
| অ্যাক্সেস মডিফায়ার | public | public private protected |
| প্যারেন্ট ক্লাসের সংখ্যা | একটি চাইল্ড ক্লাসের একাধিক প্যারেন্ট ক্লাস বা ইন্টারফেস থাকতে পারে। | একটি চাইল্ড ক্লাসের শুধুমাত্র একটি প্যারেন্ট ক্লাস বা অ্যাবস্ট্রাক্ট থাকবে। |
পলিমরফিজম(Polymorphism) বলতে আমরা বুঝি, বিভিন্ন ক্লাসের যেসব মেথডসমূহ একই কাজে ব্যবহৃত হয় তাদের নামকরণ একই হওয়া।
পলিমরফিজম কিভাবে বাস্তবায়ন করবেন?
পলিমরফিজম(Polymorphism) বাস্তবায়নের জন্য আমরা অ্যাবস্ট্রাক্ট(abstract) ক্লাস বা ইন্টারফেস এই দুইটির মধ্যে একটি বেছে নিতে পারি।
নিম্নের উদাহরণে আমরা calcArea() অ্যাবস্ট্রাক্ট মেথড বিশিষ্ট Shape নামের একটি ইন্টারফেস তৈরি করবো।
kt_satt_skill_example_id=679
এখন আমরা Circle নামে একটি ক্লাস তৈরি করবো এবং এতে Shape ইন্টারফেসটি যুক্ত করবো। এক্ষেত্রে calcArea() মেথডটি বৃত্তের পরিধি গণনা করবে।
kt_satt_skill_example_id=681
এখন আমরা Shape ইন্টারফেসটি পুনরায় Rectangle ক্লাসে যুক্ত করবো। এক্ষেত্রে calcArea() মেথডটি আয়তক্ষেত্র পরিমাপ করবে।
kt_satt_skill_example_id=683
এখন আমরা উপরের ক্লাস দুটির জন্য যথাক্রমে দুটি অবজেক্ট তৈরি করবো।
kt_satt_skill_example_id=685
এখন আমরা নিশ্চিত হতে পারি যে, তৈরিকৃত অবজেক্ট গুলো calcArea() মেথডটি ব্যবহার করে স্ব-স্ব আকৃতি পরিমাপ করবে।
এখন আমরা আকৃতি গণনা করার জন্য calcArea() মেথডটি ব্যবহার করবো।
kt_satt_skill_example_id=686
kt_satt_skill_example_id=688
ফাংশন ডিক্লেয়ারেশনের সময় আরগুমেন্ট এর জন্য প্রত্যাশিত ডেটা টাইপ( (arrays, objects, interface ইত্যাদি) নির্ধারণ করে দেওয়ার জন্য টাইপ হিন্টিং(type hinting) ব্যবহৃত হয়।
পিএইচপি OOP টাইপ হিন্টিং
আমাদের এই টিউটোরিয়ালে আমরা array এবং object এর জন্য টাইপ হিন্টিং নিয়ে আলোচনা করবো যা পিএইচপি এবং পিএইচপি৭ উভয়েই সমর্থন করে।
এছাড়া মূল ডেটা টাইপ যেমনঃ ইন্টিজার, ফ্লোট, স্ট্রিং এবং বুলিয়ানের জন্যও টাইপ হিন্টিং ব্যাখ্যা করবো যা শুধমাত্র পিএইচপি৭ এ সমর্থিত।
array টাইপ হিন্টিং
যখন আমরা কোনো ফাংশনের আরগুমেন্ট শুধুমাত্র array টাইপের পেতে চাই সেক্ষেত্রে আমরা ফাংশনের আরগুমেন্টের সামনে array কীওয়ার্ড ব্যবহার করবো। নিম্নে এর সিনট্যাক্স দেওয়া হলোঃ
kt_satt_skill_example_id=693
এখন আমরা একটি ফাংশন তৈরি করবো যা গণনা করবে গ্যাস ভর্তি ট্যাঙ্ক বিশিষ্ট একটি ট্রাক কত মাইল যেতে পারবে। আমাদের এই ফাংশনটি আর্গুমেন্ট হিসাবে শুধুমাত্র অ্যারে টাইপের ডেটা গ্রহন করবে। কারণ আর্গুমেন্টের নামের পূর্বে আমরা array কীওয়ার্ড ব্যবহার করেছি।
kt_satt_skill_example_id=696
এখন আমরা এই ফাংশনের মধ্যে দিয়ে একটি আর্গুমেন্ট পাস করাবো যা অ্যারে টাইপের নাঃ
kt_satt_skill_example_id=697
এই আর্গুমেন্টের জন্য একটি ত্রুটি পাওয়া যাবে। কারণ আমাদের এই ফাংশনটি শুধুমাত্র অ্যারে টাইপের আর্গুমেন্ট গ্রহন করতে সক্ষম। কিন্তু আমরা স্ট্রিং টাইপের আর্গুমেন্ট পাস করেছি বিধায় এই ত্রুটি পাওয়া গেছে।
এখন আমরা পুণরায় calcMiles() ফাংশনটিতে আর্গুমেন্ট পাস করাবো। তবে, এইবার আমরা array টাইপের আর্গুমেন্ট পাস করবোঃ
kt_satt_skill_example_id=698
এই ক্ষেত্রে আমাদের ফাংশনটি কাজ করেছে এবং সঠিক ফলাফল দিয়েছে। কারণ এইবার আমরা ফাংশন অনুযায়ী অ্যারে টাইপের আর্গুমেন্ট পাস করেছি।
অবজেক্ট টাইপ হিন্টিং
আমরা টাইপ হিন্টিং ব্যবহার করে যে কোনো ফাংশনে জোরপূর্বক অবজেক্ট আর্গুমেন্ট পাস করাতে পারি। এটা করার জন্য আমরা ঐ ফাংশনের মধ্যে আর্গুমেন্টের পূর্বে ক্লাসের নামটি বসিয়ে দিব।
নিম্নের উদাহরণে আমরা Truck ক্লাসে constructor ফাংশনের মধ্যে Driver ক্লাসের অবজেক্ট পাস করাবো। এটা করার জন্য আমরা constructor ফাংশনের আর্গুমেন্টের পূর্বে Driver কীওয়ার্ড ব্যবহার করবোঃ
kt_satt_skill_example_id=699
পিএইচপি কি সাধারন ডেটা টাইপ এর জন্য টাইপ হিন্টিং সমর্থন করে?
এটি নির্ভরযোগ্য।
পিএইচপি৫ ভার্সন সাধারন ডেটা টাইপ(integer, float, string এবং boolean) এর জন্য টাইপ হিন্টিং সমর্থন করে না। কিন্তু পিএইচপি৭ ভার্সনে সাধারন ডেটা টাইপ এর জন্য স্কেলার(scalar) টাইপ হন্টিং সমর্থন করে।
যেহেতু পিএইচপি৫ ভার্সন সাধারন ডেটা টাইপ(integer, float, string এবং boolean) এর জন্য টাইপ হিন্টিং সমর্থন করে না, সেহেতু কোনো আর্গুমেন্টে সাধারন ডেটা টাইপকে ভ্যালিডেট করার প্রয়োজন হলে আমরা পিএইচপি "is_" ফাংশনটি ব্যবহার করবো।
উদাহরণ স্বরূপঃ
is_bool()- ফাংশন ভ্যারিয়েবলটি বুলিয়ান(boolean) কিনা চেক করে।is_int()- ফাংশন ভ্যারিয়েবলটি ইন্টিজার(integer) বা পূর্ণ সংখ্যা কিনা চেক করে।is_float()- ফাংশন ভ্যারিয়েবলটি ফ্লোট(float) বা দশমিক সংখ্যা কিনা চেক করে।is_null()- ফাংশন ভ্যারিয়েবলটি নাল(null) বা ফাঁকা কিনা চেক করে।is_string()- ফাংশন ভ্যারিয়েবলটি স্ট্রিং(string) কিনা চেক করে।
আর পিএইচপি৭ ভার্সনের ক্ষেত্রে সাধারন ডেটা টাইপ হিসাবে স্কেলার(scalar) টাইপ হিন্টিং সমর্থন করে। যথাঃ integer, float, string এবং boolean।
নিম্নের উদাহরণটি শুধুমাত্র পিএইচপি ৭ ভার্সনে সমর্থন করেঃ
kt_satt_skill_example_id=700
ইন্টারফেস প্রোগ্রামিং কে অধিক সহজ এবং পরিবর্তনযোগ্য করে তোলে। একই ধরনের একাধিক ক্লাসে টাইপ হিন্টিং নিয়ে কাজ করার সময় ইন্টারফেস টাইপ হিন্টিং ব্যবহার করা উচিত।
অবজেক্টের জন্য টাইপ হিন্টিং যথেষ্ট নাও হতে পারে?
এখন আমরা Toyota নামে একটি ক্লাস তৈরি করবো যাতে Toyota ট্রাকের লাইসেন্স নাম্বার এবং মডেল নাম্বার থাকবে। এছাড়া এই ক্লাসের একটি গুরুত্বপূর্ণ মেথডও থাকবে যা তৈলের টাংকি তৈলের পরিমান নির্ণয় করবে।
সুতরাং আমরা calcTankVolume নামের ফাংশনটি ব্যবহার করবো। এই মেথডটি টাংকির প্রস্থ(base) এবং উচ্চতার উপর নির্ভর করে টাংকি তৈলের পরিমান নির্ণয় করবে। এছাড়া কন্সট্রাকটর মেথডে উচ্চতা, প্রস্থ এবং লাইসেন্স প্লেট নাম্বার নির্ধারন করে দিবঃ
kt_satt_skill_example_id=704
এখন আমরা ক্লাসের বাইরে এমন একটি ফাংশন তৈরি করবো যা সম্পূর্ণ টাংকির তৈলের দাম নির্ণয় করবে। আমার চাই এই ফাংশনে ব্যবহৃত আর্গুমেন্টগুলো Toyota ক্লাসের অর্ন্তরভুক্ত হোক। আর এটা করার জন্যই আমরা টাইপ হিটিং ব্যবহার করবোঃ
kt_satt_skill_example_id=705
এখন আপনি খুব সহজেই সম্পূর্ণ টাংকির তৈলের দাম নির্ণয় করতে পারেন। উদাহরণস্বরূপঃ ট্রাকের প্লেট নাম্বার 512379, বেসের দৈর্ঘ্য 10", উচ্চতা 15" এবং তৈলের দাম প্রতি লিটার $5। এখন আমরা তৈলের টাংকির দাম নির্ণয় করবোঃ
kt_satt_skill_example_id=706
ইন্টাফেস টাইপ হিন্টিং
আমরা একই ধরনের একাধিক ক্লাসে টাইপ হিন্টিং নিয়ে কাজ করার সময় ইন্টারফেস টাইপ হিন্টিং ব্যবহার করবো।
আমরা একটু আগে Toyota নামে একটি ক্লাস তৈরি করেছি যা Toyota ট্রাকের সম্পূর্ণ টাংকির তৈলের দাম নির্ণয় করে। কিন্তু এখন আমরা Mahindra ট্রাকের সম্পূর্ণ টাংকির তৈলের দাম নির্ণয় করবো। কারণ Toyota ট্রাকের টাংকির আকৃতি এবং Mahindra ট্রাকের টাংকির আকৃতি এক নয়। Mahindra ট্রাকের টাংকির আকৃতি গোলাকার বিধায় এর জন্য নিম্নের ক্লাসটি ব্যবহার করবোঃ
kt_satt_skill_example_id=708
যেহেতু আমাদের Mahindra ক্লাসটি লেখা সম্পন্ন হয়েছে, এখন আমরা Mahindra ট্র্যাকের সম্পূর্ণ টাংকির তৈলের দাম নির্ণয় করার চেষ্টা করবোঃ
kt_satt_skill_example_id=710
এই ত্রুটি পাওয়ার কারণ হচ্ছে আমরা সঠিক অবজেক্ট পাস করায় নি। আমাদের calcTankPrice() ফাংশনটি শুধুমাত্র Toyota ক্লাসের অন্তরভূক্ত অবজেক্ট গুলো গ্রহন করবে। কিন্তু আমরা Mahindra ক্লাসের অবজেক্ট পাস(pass) করানোর ফলে এই ত্রুটির সম্মুখীন হয়েছি।
এই সমস্যা সমাধান করার জন্য আমরা টাইপ হিন্টিং ব্যবহার করবো না। বরং আমরা এর চেয়ে আরও ভালো সমাধান হিসাবে ইন্টাফেসের জন্য টাইপ হিন্টিং ব্যবহার করবো। আর এটা করার জন্য আমরা abstract class এবং real interface একত্রে ব্যবহার করবো।
এখন আমরা Truck নামে একটি abstract class তৈরি করবো যা থেকে Toyota এবং Mahimdra উভয় ক্লাসকে ইনহেরিট(inherit) করবোঃ
kt_satt_skill_example_id=712
এখন আমরা Toyota এবং Mahimdra উভয় ক্লাসকে পুনরায় লিখবো যেন এরা উভইয়েই Truck ক্লাস থেকে ইনহেরিট(inherit) হয়ঃ
kt_satt_skill_example_id=715
যেহেতু উভয় ক্লাসই একই ইন্টারফেস থেকে ইনহেরিট(inherit) হয়েছে, তাই আমরা calcTankPrice() ফাংশনে Truck ইন্টারফেসটি টাইপ হিন্টিং হিসাবে ব্যবহার করবো। সুতরাং এই ইন্টারফেসটির অন্তর্গত অবজেক্টসমুহ এই ফাংশন দ্বারা অ্যাক্সেস করা সম্ভবঃ
kt_satt_skill_example_id=716
এখন আমরা calcTankPrice() ফাংশনটি ব্যবহার করে Toyota এবং Mahimdra উভয় অবজেক্টের ফলাফল দেখবোঃ
kt_satt_skill_example_id=718
অনেক ক্ষেত্রে অবজেক্ট তৈরি করা ছাড়াই ক্লাস এর মেথড এবং প্রোপার্টি অ্যাক্সেস করার প্রয়োজন হয়, এমন পরিস্থিতিতে আমরা স্ট্যাটিক(static) মেথড এবং প্রোপার্টি ব্যবহার করবো।
স্ট্যাটিক মেথড এবং প্রোপার্টি কিভাবে ডিক্লেয়ার করবেন?
কোনো ক্লাসের মধ্যে স্ট্যাটিক(static) মেথড এবং প্রোপার্টি ডিক্লেয়ার(declare) করার জন্য সংরক্ষিত কীওয়ার্ড static ব্যবহার করা হয়। অর্থাৎ মেথড এবং প্রোপার্টির নামের পূর্বে অ্যাক্সেস মডিফায়ারের static কীওয়ার্ড ব্যবহার করতে হবে।
নিম্নে স্ট্যাটিক মেথড এবং প্রোপার্টি ডিক্লেয়ার করার সিনট্যাক্স দেওয়া হলোঃ
kt_satt_skill_example_id=722
আশাকরি উপরের সিনট্যাক্সটি দেখেই আপনার কাছে স্ট্যাটিক এর ধারনা অনেকটা স্পষ্ট হয়ে গেছে। টিউটোরিয়ালের পরবর্তী অংশে আমরা স্ট্যাটিক মেথড এবং প্রোপার্টির উদাহরণ দেখবো।
স্ট্যাটিক মেথড এবং প্রোপার্টি কিভাবে অ্যাক্সেস করবেন?
আমরা টিউটোরিয়ালের প্রথমেই জেনেছি যে, কোনো স্ট্যাটিক(static) মেথড এবং প্রোপার্টিকে অ্যাক্সেস করার জন্য অবজেক্টের প্রয়োজন হয় না। বরং আমরা স্কোপ রিজোলিউশন অপারেটর(::) ব্যবহার করে এগুলোকে সরাসরি অ্যাক্সেস করতে পারি।
নিম্নে স্ট্যাটিক মেথড এবং প্রোপার্টি অ্যাক্সেস করার সিনট্যাক্স দেওয়া হলোঃ
kt_satt_skill_example_id=723
সতর্কতাঃ স্ট্যাটিক প্রোপার্টিসমুহ অ্যাক্সেস করার সময় অবশ্যই ডলার($) চিহ্ন ব্যবহার করতে হবে।
স্ট্যাটিক মেথড এবং প্রোপার্টি কিভাবে ক্লাসের মধ্য থেকে অ্যাক্সেস করবেন?
আমরা সাধারনত $this কীওয়ার্ড ব্যবহার করে ক্লাসের মেথড এবং প্রোপার্টিসমুহকে একই ক্লাসের মধ্য থেকে অ্যাক্সেস করতে পারি। ঠিক একই পদ্ধতি অবলম্বন করে আমরা স্ট্যাটিক মেথড এবং প্রোপার্টিসমূহ অ্যাক্সেস করবো। তবে এই ক্ষেত্রে আমরা সংরক্ষিত কীওয়ার্ড this এর পরিবর্তে self এবং এর সাথে স্কোপ রিজোলিউশন অপারেটর(::) ব্যবহার করবো।
নিম্নে স্ট্যাটিক মেথড এবং প্রোপার্টিকে একই ক্লাসের মধ্য থেকে অ্যাক্সেস করার সিনট্যাক্স দেওয়া হলোঃ
kt_satt_skill_example_id=728
এখন পর্যন্ত আমরা অনেকগুলো সিনট্যাক্স দেখলাম। এবার আমরা স্ট্যাটিক মেথড এবং প্রোপার্টির একটি উদাহরণ দেখবোঃ
kt_satt_skill_example_id=725
স্ট্যাটিক মেথড এবং প্রোপার্টি কখন ব্যবহার করবেন?
স্ট্যাটিক মেথড এবং প্রোপার্টি ব্যবহার করা খুব ভালো অভ্যাস নয়। যাইহোক, এটি ব্যবহার করলে আমরা অবজেক্ট তৈরি করা ছাড়াই সরাসরি মেথড এবং প্রোপার্টিকে অ্যাক্সেস করতে পারি। বিশেষকরে আমরা কাউন্টার(Counter) এবং উটিলিটি(Utility) ক্লাসের ক্ষেত্রে স্ট্যাটিক(static) মেথড এবং প্রোপার্টি ব্যবহার করবো।
কাউন্টার এর ক্ষেত্রে
আমরা কাউন্টার এর জন্য স্ট্যাটিক প্রোপার্টি ব্যবহার করি। কারণ স্ট্যাটিক প্রোপার্টিসমূহ সর্বশেষ অ্যাসাইনকৃত মান সংরক্ষন করে রাখতে পারে। নিম্নে এর একটি উদাহরণ দেখবোঃ
kt_satt_skill_example_id=730
ইউটিলিটি ক্লাসের ক্ষেত্রে
ইউটিলিটি ক্লাসের ক্ষেত্রে সচরাচর স্ট্যাটিক মেথড ব্যবহৃত হয়। ইউটিলিটি ক্লাস গুলোর একমাত্র উদ্দেশ্য হচ্ছে প্রধান ক্লাস গুলোকে সাহায্য করা। ইউটিলিটি মেথডসমূহ সব ধরনের কার্য সম্পাদন করতে পারে। যেমনঃ পরিমাপের সিস্টেম, ডেটা এনক্রিপশন, স্যানিটেশন এবং অন্য যে কোনো কাজ যা আমাদের মূল অ্যাপ্লিকেশনের জন্য অনেক বড় সহায়ক।
নিম্নের উদাহরণে আমরা একটি স্ট্যাটিক মেথড ব্যবহার করবো যা ব্যবহারকারীকে আর্গুমেন্ট লিংকে রি-ডাইরেক্ট করবেঃ
kt_satt_skill_example_id=731
স্ট্যাটিক ব্যবহারে সতর্কতা অবলম্বন করা উচিত
আপনার নিজের সুবিধার জন্য স্ট্যাটিক ব্যবহার করা উচিৎ নয়। এটি অবশ্যই যেন ইউটিলিটি ক্লাস বা সাহায্যকারী ক্লাসের জন্য ব্যবহার করা হয়।
আপনি হয়ত স্ট্যাটিক মেথড এবং প্রোপার্টি ব্যবহার করার চিন্তা করছেন। কারণ এটির ব্যবহারঅনেক সুবিধাজনক এবং অবজেক্ট তৈরি না করেই স্ট্যাটিক মেথড এবং প্রোপার্টিকে অ্যাক্সেস করা যায়।
স্ট্যাটিক মেথড ব্যবহারে সব সময় সতর্ক থাকুন, কারণ এটি ব্যবহারে আপনি নিম্নের প্রধান দুটি অসুবিধার সম্মূখিন হতে পারেনঃ
- স্ট্যাটিক মেথড বিশিষ্ট ক্লাসসমূহ স্বয়ংক্রিয়ভাবে পরীক্ষা করা অনেক কঠিন।
- স্ট্যাটিক মেথড এবং প্রোপার্টিগুলো গ্লোবাল হওয়ার কারণে যে কোনো জায়গা থেকে অ্যাক্সেস করা যায়। এই বিষয়টি আমরা যতটা সম্ভব এড়ানোর চেষ্টা করি।
সুতরাং আপনি নিশ্চয় অসুবিধার জন্য স্ট্যাটিক ব্যবহার করবেন না। বরং সুবিধার জন্য ইউটিলিটি ক্লাসে এটি ব্যবহার করবেন।
Read more