এখন পর্যন্ত কভার করা প্রতিটি property আর method একটি নির্দিষ্ট object-এর — $user1 আর $user2-এর প্রতিটার নিজের আলাদা কপি আছে। একটি static member ক্লাস নিজের সাথে সম্পর্কিত, সেই ক্লাসের প্রতিটি object জুড়ে একইভাবে শেয়ার করা।
class User {
public static int $totalUsers = 0;
public function __construct() {
self::$totalUsers++;
}
}
new User();
new User();
new User();
echo User::$totalUsers; // 3সিনট্যাক্সের পার্থক্য লক্ষ্য করুন: একটি static property :: দিয়ে আর নামের আগে কোনো $ ছাড়াই access হয় (User::$totalUsers), একটি object-এ -> দিয়ে কখনো না।
ক্লাসের ভেতরে, self:: static member-কে refer করে — সরাসরি ক্লাসের নাম ব্যবহার করাও কাজ করে, কিন্তু ক্লাসের নাম পরে বদলালেও self:: সঠিক থাকে।
ক্লাসের উপর নিজেই call করা হয়, একটা object instance এর কোনো দরকার ছাড়াই।
class MathHelper {
public static function square(int $n): int {
return $n * $n;
}
}
echo MathHelper::square(5); // 25 — কোনো "new MathHelper()" দরকার নেই| যখন static ব্যবহার করবেন... | যখন একটি সাধারণ (instance) method ব্যবহার করবেন... |
|---|---|
| Logic কোনো নির্দিষ্ট object-এর data-র উপর নির্ভর করে না | Logic একটি নির্দিষ্ট object-এর property পড়ে বা বদলায় |
| Organization-এর জন্য একটি ক্লাসের ভেতরে group করা একটি utility function | Method সত্যিকারভাবে একটি single object যা করে তা represent করে |
| প্রতিটি instance জুড়ে একটি counter বা শেয়ার করা মান | প্রতিটি object-এর নিজের স্বাধীন মান দরকার |
প্রধান সীমাবদ্ধতা
একটি static method $this access করতে পারে না — এর refer করার মতো কোনো নির্দিষ্ট object নেই। আসলে যেখানে মানায় তার বদলে default হিসেবে static-এ যাওয়া একটি common শুরুর দিকের overuse।