Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

การโหลดซ้อน (Overloading) ใน PHP

บทนำ

แนวคิดของ "การโหลดซ้อน" (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!