Method Overloading คือแนวคิด OOP สร้างหลายเมธอดชื่อเดียวกัน แต่งานต่างกันตามพารามิเตอร์ที่รับ ภาษาอื่นรองรับโดยตรง (Static Polymorphism) แต่ PHP ไม่รองรับแบบนี้
ตัวอย่างที่ล้มเหลวใน PHP
<?php
class machine {
function doTask($var1){ return $var1; }
function doTask($var1,$var2){ return $var1 * $var1; }
}
$task1 = new machine();
$task1->doTask(5,10);
?>
ผลลัพธ์
Error
PHP error: Cannot redeclare method doTask() แต่ภาษาอื่นถือว่า overloaded method เรียกตามจำนวนพารามิเตอร์ เรียกว่า Static Polymorphism
ใน PHP ใช้ Magic Method __call() เพื่อทำ Method Overloading แบบ Dynamic: พฤติกรรมเมธอดเปลี่ยนตามพารามิเตอร์ที่ส่งเข้า
__call()
ถ้าคลาสมี __call() เมื่อเรียกเมธอดที่ไม่มีอยู่จริง __call() จะถูกเรียกแทน
ตัวอย่าง Method Overloading ด้วย __call()
<?php
class Shape {
const PI = 3.142;
function __call($name, $arg){
if($name == 'area')
switch(count($arg)){
case 0: return 0;
case 1: return self::PI * $arg[0];
case 2: return $arg[0] * $arg[1];
}
}
}
$circle = new Shape();
echo $circle->area(3);
$rect = new Shape();
echo $rect->area(8,6);
?>
ผลลัพธ์
9.426 48
คำอธิบาย
เมธอด area() ถูกสร้างแบบ dynamic โดย __call() พฤติกรรมเปลี่ยนตามจำนวนพารามิเตอร์ที่ส่งเข้า