পিএইচপি OOP স্ট্যাটিক মেথড এবং প্রোপার্টি
অনেক ক্ষেত্রে অবজেক্ট তৈরি করা ছাড়াই ক্লাস এর মেথড এবং প্রোপার্টি অ্যাক্সেস করার প্রয়োজন হয়, এমন পরিস্থিতিতে আমরা স্ট্যাটিক(static) মেথড এবং প্রোপার্টি ব্যবহার করবো।
স্ট্যাটিক মেথড এবং প্রোপার্টি কিভাবে ডিক্লেয়ার করবেন?
কোনো ক্লাসের মধ্যে স্ট্যাটিক(static) মেথড এবং প্রোপার্টি ডিক্লেয়ার(declare) করার জন্য সংরক্ষিত কীওয়ার্ড static
ব্যবহার করা হয়। অর্থাৎ মেথড এবং প্রোপার্টির নামের পূর্বে অ্যাক্সেস মডিফায়ারের static
কীওয়ার্ড ব্যবহার করতে হবে।
নিম্নে স্ট্যাটিক মেথড এবং প্রোপার্টি ডিক্লেয়ার করার সিনট্যাক্স দেওয়া হলোঃ
class ClassName {
// স্ট্যাটিক প্রোপার্টি ডিক্লেয়ার
static public proertyName;
// স্ট্যাটিক মেথড ডিক্লেয়ার
static public function methodName() {
// মেথডের কোড সমুহ এখানে থাকবে
}
}
আশাকরি উপরের সিনট্যাক্সটি দেখেই আপনার কাছে স্ট্যাটিক এর ধারনা অনেকটা স্পষ্ট হয়ে গেছে। টিউটোরিয়ালের পরবর্তী অংশে আমরা স্ট্যাটিক মেথড এবং প্রোপার্টির উদাহরণ দেখবো।
স্ট্যাটিক মেথড এবং প্রোপার্টি কিভাবে অ্যাক্সেস করবেন?
আমরা টিউটোরিয়ালের প্রথমেই জেনেছি যে, কোনো স্ট্যাটিক(static) মেথড এবং প্রোপার্টিকে অ্যাক্সেস করার জন্য অবজেক্টের প্রয়োজন হয় না। বরং আমরা স্কোপ রিজোলিউশন অপারেটর(::) ব্যবহার করে এগুলোকে সরাসরি অ্যাক্সেস করতে পারি।
নিম্নে স্ট্যাটিক মেথড এবং প্রোপার্টি অ্যাক্সেস করার সিনট্যাক্স দেওয়া হলোঃ
// স্ট্যাটিক প্রোপার্টিতে মান ডিফাইন
ClassName::$propertyName = value;
// স্ট্যাটিক মেথড এবং প্রোপার্টির আউটপুট
echo ClassName::$propertyName;
echo ClassName::methodName();
সতর্কতাঃ স্ট্যাটিক প্রোপার্টিসমুহ অ্যাক্সেস করার সময় অবশ্যই ডলার($) চিহ্ন ব্যবহার করতে হবে।
স্ট্যাটিক মেথড এবং প্রোপার্টি কিভাবে ক্লাসের মধ্য থেকে অ্যাক্সেস করবেন?
আমরা সাধারনত $this
কীওয়ার্ড ব্যবহার করে ক্লাসের মেথড এবং প্রোপার্টিসমুহকে একই ক্লাসের মধ্য থেকে অ্যাক্সেস করতে পারি। ঠিক একই পদ্ধতি অবলম্বন করে আমরা স্ট্যাটিক মেথড এবং প্রোপার্টিসমূহ অ্যাক্সেস করবো। তবে এই ক্ষেত্রে আমরা সংরক্ষিত কীওয়ার্ড this
এর পরিবর্তে self
এবং এর সাথে স্কোপ রিজোলিউশন অপারেটর(::) ব্যবহার করবো।
নিম্নে স্ট্যাটিক মেথড এবং প্রোপার্টিকে একই ক্লাসের মধ্য থেকে অ্যাক্সেস করার সিনট্যাক্স দেওয়া হলোঃ
class ClassName {
// স্ট্যাটিক প্রোপার্টি ডিক্লেয়ার
static public proertyName;
// স্ট্যাটিক মেথড ডিক্লেয়ার
static public function methodName($value) {
self::$propertyName = $value;
}
}
এখন পর্যন্ত আমরা অনেকগুলো সিনট্যাক্স দেখলাম। এবার আমরা স্ট্যাটিক মেথড এবং প্রোপার্টির একটি উদাহরণ দেখবোঃ
<?php
class Add {
static public $number;
static public function setNumber($value) {
self::$number += $value;
}
}
Add::setNumber(5);
echo Add::$number;
echo "<br>";
Add::setNumber(5);
echo Add::$number;
echo "<br>";
Add::setNumber(5);
echo Add::$number;
?>
5
10
15
স্ট্যাটিক মেথড এবং প্রোপার্টি কখন ব্যবহার করবেন?
স্ট্যাটিক মেথড এবং প্রোপার্টি ব্যবহার করা খুব ভালো অভ্যাস নয়। যাইহোক, এটি ব্যবহার করলে আমরা অবজেক্ট তৈরি করা ছাড়াই সরাসরি মেথড এবং প্রোপার্টিকে অ্যাক্সেস করতে পারি। বিশেষকরে আমরা কাউন্টার(Counter) এবং উটিলিটি(Utility) ক্লাসের ক্ষেত্রে স্ট্যাটিক(static) মেথড এবং প্রোপার্টি ব্যবহার করবো।
কাউন্টার এর ক্ষেত্রে
আমরা কাউন্টার এর জন্য স্ট্যাটিক প্রোপার্টি ব্যবহার করি। কারণ স্ট্যাটিক প্রোপার্টিসমূহ সর্বশেষ অ্যাসাইনকৃত মান সংরক্ষন করে রাখতে পারে। নিম্নে এর একটি উদাহরণ দেখবোঃ
<?php
class Add {
static public $number = 5;
static public function setNumber() {
self::$number++;
}
}
echo Add::$number;
echo "<br>";
Add::setNumber();
echo Add::$number;
echo "<br>";
Add::setNumber();
echo Add::$number;
?>
5
6
7
ইউটিলিটি ক্লাসের ক্ষেত্রে
ইউটিলিটি ক্লাসের ক্ষেত্রে সচরাচর স্ট্যাটিক মেথড ব্যবহৃত হয়। ইউটিলিটি ক্লাস গুলোর একমাত্র উদ্দেশ্য হচ্ছে প্রধান ক্লাস গুলোকে সাহায্য করা। ইউটিলিটি মেথডসমূহ সব ধরনের কার্য সম্পাদন করতে পারে। যেমনঃ পরিমাপের সিস্টেম, ডেটা এনক্রিপশন, স্যানিটেশন এবং অন্য যে কোনো কাজ যা আমাদের মূল অ্যাপ্লিকেশনের জন্য অনেক বড় সহায়ক।
নিম্নের উদাহরণে আমরা একটি স্ট্যাটিক মেথড ব্যবহার করবো যা ব্যবহারকারীকে আর্গুমেন্ট লিংকে রি-ডাইরেক্ট করবেঃ
<?php
class UserRedirect {
// মেথডটি পিএইচপি হেডার ফাংশন ব্যবহার করে ব্যবহারকারীকে রি-ডাইরেক্ট করে
static public function redirect($link) {
header("Location: $link");
exit;
}
}
UserRedirect::redirect("http://www.sattacademy.com");
?>
স্ট্যাটিক ব্যবহারে সতর্কতা অবলম্বন করা উচিত
আপনার নিজের সুবিধার জন্য স্ট্যাটিক ব্যবহার করা উচিৎ নয়। এটি অবশ্যই যেন ইউটিলিটি ক্লাস বা সাহায্যকারী ক্লাসের জন্য ব্যবহার করা হয়।
আপনি হয়ত স্ট্যাটিক মেথড এবং প্রোপার্টি ব্যবহার করার চিন্তা করছেন। কারণ এটির ব্যবহারঅনেক সুবিধাজনক এবং অবজেক্ট তৈরি না করেই স্ট্যাটিক মেথড এবং প্রোপার্টিকে অ্যাক্সেস করা যায়।
স্ট্যাটিক মেথড ব্যবহারে সব সময় সতর্ক থাকুন, কারণ এটি ব্যবহারে আপনি নিম্নের প্রধান দুটি অসুবিধার সম্মূখিন হতে পারেনঃ
- স্ট্যাটিক মেথড বিশিষ্ট ক্লাসসমূহ স্বয়ংক্রিয়ভাবে পরীক্ষা করা অনেক কঠিন।
- স্ট্যাটিক মেথড এবং প্রোপার্টিগুলো গ্লোবাল হওয়ার কারণে যে কোনো জায়গা থেকে অ্যাক্সেস করা যায়। এই বিষয়টি আমরা যতটা সম্ভব এড়ানোর চেষ্টা করি।
সুতরাং আপনি নিশ্চয় অসুবিধার জন্য স্ট্যাটিক ব্যবহার করবেন না। বরং সুবিধার জন্য ইউটিলিটি ক্লাসে এটি ব্যবহার করবেন।