পিএইচপি OOP টাইপ হিন্টিং
ফাংশন ডিক্লেয়ারেশনের সময় আরগুমেন্ট এর জন্য প্রত্যাশিত ডেটা টাইপ( (arrays, objects, interface ইত্যাদি) নির্ধারণ করে দেওয়ার জন্য টাইপ হিন্টিং(type hinting) ব্যবহৃত হয়।
পিএইচপি OOP টাইপ হিন্টিং
আমাদের এই টিউটোরিয়ালে আমরা array এবং object এর জন্য টাইপ হিন্টিং নিয়ে আলোচনা করবো যা পিএইচপি এবং পিএইচপি৭ উভয়েই সমর্থন করে।
এছাড়া মূল ডেটা টাইপ যেমনঃ ইন্টিজার, ফ্লোট, স্ট্রিং এবং বুলিয়ানের জন্যও টাইপ হিন্টিং ব্যাখ্যা করবো যা শুধমাত্র পিএইচপি৭ এ সমর্থিত।
array টাইপ হিন্টিং
যখন আমরা কোনো ফাংশনের আরগুমেন্ট শুধুমাত্র array টাইপের পেতে চাই সেক্ষেত্রে আমরা ফাংশনের আরগুমেন্টের সামনে array কীওয়ার্ড ব্যবহার করবো। নিম্নে এর সিনট্যাক্স দেওয়া হলোঃ
<?php
function functionName (array $argumentName){
// কোড এখানে থাকবে
}
?>
এখন আমরা একটি ফাংশন তৈরি করবো যা গণনা করবে গ্যাস ভর্তি ট্যাঙ্ক বিশিষ্ট একটি ট্রাক কত মাইল যেতে পারবে। আমাদের এই ফাংশনটি আর্গুমেন্ট হিসাবে শুধুমাত্র অ্যারে টাইপের ডেটা গ্রহন করবে। কারণ আর্গুমেন্টের নামের পূর্বে আমরা array
কীওয়ার্ড ব্যবহার করেছি।
<?php
function calcMiles(array $models) {
foreach($models as $item) {
echo $truckModel = $item[0] . " : ";
echo $numberOfMiles = $item[1] * $item[2] . "<br/>";
}
}
?>
এখন আমরা এই ফাংশনের মধ্যে দিয়ে একটি আর্গুমেন্ট পাস করাবো যা অ্যারে টাইপের নাঃ
calcMiles("Toyota");
এই আর্গুমেন্টের জন্য একটি ত্রুটি পাওয়া যাবে। কারণ আমাদের এই ফাংশনটি শুধুমাত্র অ্যারে টাইপের আর্গুমেন্ট গ্রহন করতে সক্ষম। কিন্তু আমরা স্ট্রিং টাইপের আর্গুমেন্ট পাস করেছি বিধায় এই ত্রুটি পাওয়া গেছে।
Catchable fatal error: Argument 1 passed to calcMiles()
must be of the type array, string given
এখন আমরা পুণরায় calcMiles()
ফাংশনটিতে আর্গুমেন্ট পাস করাবো। তবে, এইবার আমরা array টাইপের আর্গুমেন্ট পাস করবোঃ
<?php
$models = array(
array('Toyota', 6, 22),
array('Mahindra', 5, 20)
);
calcMiles($models);
?>
ফলাফল
Toyota : 132
Mahindra : 100
এই ক্ষেত্রে আমাদের ফাংশনটি কাজ করেছে এবং সঠিক ফলাফল দিয়েছে। কারণ এইবার আমরা ফাংশন অনুযায়ী অ্যারে টাইপের আর্গুমেন্ট পাস করেছি।
অবজেক্ট টাইপ হিন্টিং
আমরা টাইপ হিন্টিং ব্যবহার করে যে কোনো ফাংশনে জোরপূর্বক অবজেক্ট আর্গুমেন্ট পাস করাতে পারি। এটা করার জন্য আমরা ঐ ফাংশনের মধ্যে আর্গুমেন্টের পূর্বে ক্লাসের নামটি বসিয়ে দিব।
নিম্নের উদাহরণে আমরা Truck ক্লাসে constructor ফাংশনের মধ্যে Driver ক্লাসের অবজেক্ট পাস করাবো। এটা করার জন্য আমরা constructor ফাংশনের আর্গুমেন্টের পূর্বে Driver
কীওয়ার্ড ব্যবহার করবোঃ
উদাহরণ
<?php
class Truck {
protected $driver;
// constructor ফাংশনটি আর্গুমেন্ট হিসাবে Driver অবজেক্ট গ্রহন করবে
public function __construct(Driver $driver)
{
$this->driver = $driver;
}
}
class Driver {}
$driver = new Driver();
$truck = new Truck($driver);
?>
পিএইচপি কি সাধারন ডেটা টাইপ এর জন্য টাইপ হিন্টিং সমর্থন করে?
এটি নির্ভরযোগ্য।
পিএইচপি৫ ভার্সন সাধারন ডেটা টাইপ(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।
নিম্নের উদাহরণটি শুধুমাত্র পিএইচপি ৭ ভার্সনে সমর্থন করেঃ
উদাহরণ
<?php
class Truck {
protected $model;
protected $hasBody;
protected $numberOfTires;
protected $price;
// স্ট্রিং(string) টাইপ হিন্টিং
public function setModel(string $model){
$this->model = $model;
}
// বুলিয়ান(boolean) টাইপ হিন্টিং
public function setHasBody(bool $value){
$this->hasBody = $value;
}
// ইন্টিজার(integer) টাইপ হিন্টিং
public function setNumberOfTires(int $value){
$this->numberOfTires = $value;
}
// ফ্লোট(float) টাইপ হিন্টিং
public function setPrice(float $value){
$this->price = $value;
}
}
?>