PHP একটি object-এর উপর নির্দিষ্ট operation-এর প্রতিক্রিয়ায় স্বয়ংক্রিয়ভাবে বিশেষভাবে-নামকরণ করা হাতেগোনা কিছু method call করে — নেই এমন একটি property পড়া, একটি object-কে string হিসেবে treat করা, আর আরো কয়েকটা। আগের lesson থেকে __construct() সবচেয়ে common একটা; বাকিগুলো জানার যোগ্য।
class Money {
public function __construct(private int $cents) {}
public function __toString(): string {
return '$' . number_format($this->cents / 100, 2);
}
}
$price = new Money(1999);
echo $price; // $19.99 — echo স্বয়ংক্রিয়ভাবে __toString() call করেস্পষ্টভাবে declare করা না এমন একটি property পড়া বা লেখার চেষ্টা করলে চলে — computed বা dynamically-সংরক্ষিত property-র জন্য useful।
class Config {
private array $data = [];
public function __get(string $name) {
return $this->data[$name] ?? null;
}
public function __set(string $name, $value): void {
$this->data[$name] = $value;
}
}
$config = new Config();
$config->siteName = 'My App'; // __set() trigger করে
echo $config->siteName; // __get() trigger করে — "My App"class ApiClient {
public function __call(string $method, array $args) {
return "Called $method with " . count($args) . " argument(s)";
}
}
$client = new ApiClient();
echo $client->getUsers(1, 2); // "Called getUsers with 2 argument(s)"| Method | কখন চলে... |
|---|---|
| __construct() | একটি object তৈরি হলে |
| __destruct() | একটি object destroy হলে বা script শেষ হলে |
| __toString() | একটি object একটি string context-এ ব্যবহৃত হলে (echo, concatenation) |
| __get() / __set() | একটি undefined property পড়া বা লেখা হলে |
| __call() | একটি undefined method call করা হলে |
একটি আসল trade-off, ফ্রি upgrade না
Magic method কোড trace করা কঠিন করে — $config->siteName-এ একটি click-to-definition কোথাও স্পষ্ট নিয়ে যায় না। একটি সত্যিকারের, নির্দিষ্ট দরকারে এগুলো ব্যবহার করুন (একটি config object, একটি lightweight ORM), একটি ক্লাস লেখার default উপায় হিসেবে না।