ใครบอกว่า PHP ไม่รองรับฟังก์ชั่นการโหลดมากเกินไป? !!!
ที่จริงแล้ว PHP รองรับฟังก์ชั่นการทำงานหนักเกินไป แต่ก็แตกต่างกัน ฟีเจอร์การโอเวอร์โหลดของ PHP แตกต่างจากของ Java:
การตีความ "overloading" ของ PHP นั้นแตกต่างจากภาษาเชิงวัตถุส่วนใหญ่ การโอเวอร์โหลดแบบดั้งเดิมให้ความสามารถในการมีหลายวิธีที่มีชื่อเดียวกัน แต่มีปริมาณและประเภทของอาร์กิวเมนต์ที่แตกต่างกัน
ชำระเงินบล็อกรหัสต่อไปนี้
ฟังก์ชั่นเพื่อค้นหาผลรวมของตัวเลข n:
function findSum() {
$sum = 0;
foreach (func_get_args() as $arg) {
$sum += $arg;
}
return $sum;
}
echo findSum(1, 2), '<br />'; //outputs 3
echo findSum(10, 2, 100), '<br />'; //outputs 112
echo findSum(10, 22, 0.5, 0.75, 12.50), '<br />'; //outputs 45.75
ฟังก์ชั่นเพื่อเพิ่มตัวเลขสองตัวหรือเพื่อเชื่อมสองสายเข้าด้วยกัน:
function add() {
//cross check for exactly two parameters passed
//while calling this function
if (func_num_args() != 2) {
trigger_error('Expecting two arguments', E_USER_ERROR);
}
//getting two arguments
$args = func_get_args();
$arg1 = $args[0];
$arg2 = $args[1];
//check whether they are integers
if (is_int($arg1) && is_int($arg2)) {
//return sum of two numbers
return $arg1 + $arg2;
}
//check whether they are strings
if (is_string($arg1) && is_string($arg2)) {
//return concatenated string
return $arg1 . ' ' . $arg2;
}
trigger_error('Incorrect parameters passed', E_USER_ERROR);
}
echo add(10, 15), '<br />'; //outputs 25
echo add("Hello", "World"), '<br />'; //outputs Hello World
วิธีการเชิงวัตถุรวมถึงวิธีการมากไป:
การใช้งานมากเกินไปใน PHP นั้นหมายถึงคุณสมบัติและวิธีการ "สร้าง" แบบไดนามิก เอนทิตีแบบไดนามิกเหล่านี้ได้รับการประมวลผลด้วยวิธีเวทย์มนตร์ที่ใคร ๆ ก็สามารถสร้างได้ในคลาสสำหรับประเภทการกระทำต่าง ๆ
Ref: http://php.net/manual/th/language.oop5.overloading.php
ใน PHP การบรรทุกเกินพิกัดหมายความว่าคุณสามารถเพิ่มสมาชิกวัตถุที่ใช้เวลาโดยการใช้บางส่วนของวิธีการมายากลเช่น__set
, __get
, __call
ฯลฯ
class Foo {
public function __call($method, $args) {
if ($method === 'findSum') {
echo 'Sum is calculated to ' . $this->_getSum($args);
} else {
echo "Called method $method";
}
}
private function _getSum($args) {
$sum = 0;
foreach ($args as $arg) {
$sum += $arg;
}
return $sum;
}
}
$foo = new Foo;
$foo->bar1(); // Called method bar1
$foo->bar2(); // Called method bar2
$foo->findSum(10, 50, 30); //Sum is calculated to 90
$foo->findSum(10.75, 101); //Sum is calculated to 111.75