บทนำ
แนวคิดของ "การโหลดซ้อน" (Overloading) ใน PHP แตกต่างจากภาษาเชิงวัตถุอื่นๆ เช่น C++ หรือ Java ที่หมายถึงความสามารถในการมีเมธอดชื่อเดียวกันหลายเมธอดแต่พารามิเตอร์หรือชนิดคืนค่าแตกต่างกัน ใน PHP ข้อความ "การโหลดซ้อน" หมายถึงความสามารถในการสร้างพร็อพเพอร์ตีและเมธอดแบบไดนามิก (Dynamic) โดยใช้ Magic Methods (เมธอดที่ขึ้นต้นด้วย underscore คู่ __) เพื่อจัดการพร็อพเพอร์ตีและเมธอดที่เข้าถึงไม่ได้หรือไม่มีอยู่จริง
Magic Methods สำหรับ Property Overloading
Magic methods ต่อไปนี้ใช้สำหรับการโหลดซ้อนพร็อพเพอร์ตี:
public __set ( string $name , mixed $value ) : void public __get ( string $name ) : mixed public __isset ( string $name ) : bool public __unset ( string $name ) : void
- __set() - เรียกเมื่อเขียนข้อมูลลงพร็อพเพอร์ตีที่เข้าถึงไม่ได้ (protected, private) หรือไม่มีอยู่
- __get() - เรียกเมื่ออ่านข้อมูลจากพร็อพเพอร์ตีที่เข้าถึงไม่ได้
- __isset() - เรียกเมื่อใช้ isset() หรือ empty() กับพร็อพเพอร์ตีที่เข้าถึงไม่ได้
- __unset() - เรียกเมื่อใช้ unset() กับพร็อพเพอร์ตีที่เข้าถึงไม่ได้
ตัวอย่าง Property Overloading
โค้ดต่อไปนี้สาธิตการตั้งค่า อ่านค่า และลบพร็อพเพอร์ตีไดนามิกชื่อ myprop:
<?php
class myclass {
public function __set($name, $value) {
echo "setting $name property to $value \n";
$this->$name = $value;
}
public function __get($name) {
echo "value of $name property is ";
return $this->$name;
}
public function __isset($name) {
return isset($this->$name);
}
public function __unset($name) {
unset($this->$name);
}
}
$obj = new myclass();
$obj->myprop = "test";
echo $obj->myprop . "\n";
var_dump(isset($obj->myprop));
unset($obj->myprop);
var_dump(isset($obj->myprop));
?>
ผลลัพธ์
setting myprop property to test value of myprop property is test bool(true) bool(false)
Method Overloading
สำหรับการโหลดซ้อนเมธอด ใช้ Magic Methods สองตัวคือ __call() และ __callStatic():
public __call ( string $name , array $arguments ) : mixed public static __callStatic ( string $name , array $arguments ) : mixed
- __call() - เรียกเมื่อเรียกใช้เมธอดที่เข้าถึงไม่ได้ในบริบทออบเจ็กต์ (Object context)
- __callStatic() - เรียกเมื่อเรียกใช้เมธอดที่เข้าถึงไม่ได้ในบริบทสแตติก (Static context)
ตัวอย่าง Method Overloading
<?php
class myclass {
public function __call($name, $args) {
// หมายเหตุ: ค่า $name เป็น case sensitive
echo "Calling object method $name with " . implode(" ", $args) . "\n";
}
public static function __callStatic($name, $args) {
echo "Calling static method $name with " . implode(" ", $args) . "\n";
}
}
$obj = new myclass();
$obj->mymethod("Hello World!");
myclass::mymethod("Hello World!");
?>
ผลลัพธ์
Calling object method mymethod with Hello World! Calling static method mymethod with Hello World!