PHP4 มีไวยากรณ์การโอเวอร์โหลดอยู่แล้วเพื่อสร้างการแมปกับโมเดลออบเจ็กต์ภายนอก เช่นเดียวกับ Java และ COM PHP5 นำเสนอการโอเวอร์โหลดเชิงวัตถุที่มีประสิทธิภาพ ช่วยให้โปรแกรมเมอร์สามารถสร้างพฤติกรรมที่กำหนดเองเพื่อเข้าถึงคุณสมบัติและวิธีการเรียก
การโอเวอร์โหลดสามารถทำได้ผ่านวิธีการพิเศษหลายวิธี __get __set และ __call เมื่อกลไก Zend พยายามเข้าถึงสมาชิกแต่ไม่พบ PHP จะเรียกใช้เมธอดเหล่านี้
ในตัวอย่างในรูปที่ 1 __get และ __set จะแทนที่ Access ทั้งหมดไปยังอาร์เรย์ของตัวแปรแอ็ตทริบิวต์ คุณสามารถทำได้ ใช้การกรองประเภทใดก็ได้ที่คุณต้องการ ตัวอย่างเช่น สคริปต์สามารถปิดใช้งานการตั้งค่าแอตทริบิวต์ เริ่มต้นด้วยคำนำหน้าบางอย่าง หรือรวมค่าบางประเภทไว้ด้วย
วิธีการ __call จะแสดงวิธีที่คุณสามารถเรียกวิธีการที่ไม่ได้กำหนดได้ ชื่อวิธีการและพารามิเตอร์ที่ได้รับโดยวิธีการจะถูกส่งผ่านไปยังวิธีการ __call และ PHP จะส่งผ่านค่าของ __call กลับไปยังวิธีที่ไม่ได้กำหนด
การโอเวอร์โหลดระดับผู้ใช้
<?php
คลาสโอเวอร์โหลดเดอร์
-
$properties ส่วนตัว = array();
ฟังก์ชั่น __get($property_name)
-
ถ้า(isset($this->คุณสมบัติ[$property_name]))
-
กลับ($this->คุณสมบัติ[$property_name]);
-
อื่น
-
กลับ (โมฆะ);
-
}
ฟังก์ชั่น __set($property_name, $value)
-
$this->properties[$property_name] = $value;
}
ฟังก์ชั่น __call($function_name, $args)
-
print("เรียกใช้ $function_name()n");
print("อาร์กิวเมนต์: ");
print_r($args);
กลับ(TRUE);
-
-
$o = new Overloader();
// เรียกใช้ __set() กำหนดค่าให้กับตัวแปรแอตทริบิวต์ที่ไม่มีอยู่จริงและเปิดใช้งาน __set()
$o->dynaProp = "เนื้อหาแบบไดนามิก";
//เรียกใช้ __get() เปิดใช้งาน __get()
print($o->dynaProp . "n");
//เรียกใช้ __call() เปิดใช้งาน __call()
$o->dynaMethod("ลีออน", "ซีฟ");
?>
การโหลดคลาสอัตโนมัติ
เมื่อคุณพยายามใช้คลาสที่ไม่ได้กำหนด PHP จะรายงานข้อผิดพลาดร้ายแรง วิธีแก้ไขคือการเพิ่มคลาสซึ่งสามารถรวมไว้ในไฟล์ได้ อย่างไรก็ตาม คุณจะรู้ว่าควรใช้คลาสใด มีฟังก์ชันการโหลดอัตโนมัติสำหรับคลาสต่างๆ ซึ่งสามารถประหยัดเวลาในการเขียนโปรแกรมได้ เมื่อคุณพยายามใช้คลาสที่ PHP ไม่ได้จัดระเบียบไว้ มันจะค้นหาฟังก์ชันโกลบอล __autoload ถ้ามีฟังก์ชันนี้ PHP จะเรียกมันด้วยพารามิเตอร์ พารามิเตอร์คือชื่อของคลาส
ตัวอย่างรูปที่ 2 แสดงให้เห็นว่า __autoload ถูกใช้อย่างไร โดยถือว่าแต่ละไฟล์ในไดเร็กทอรีปัจจุบันสอดคล้องกับคลาส คลาสผู้ใช้ถูกกำหนดไว้ใน class_User.php ไม่ว่าการโทรจะเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กก็ตาม PHP จะส่งคืนชื่อตัวพิมพ์เล็ก
โดย
อัตโนมัติ
//กำหนดฟังก์ชันโหลดอัตโนมัติ
ฟังก์ชั่น __โหลดอัตโนมัติ($คลาส)
-
รวม("class_" .ucfirst($class) . ".php");
}
//ใช้คลาสที่ต้องโหลดอัตโนมัติ
$u = ผู้ใช้ใหม่;
$u->ชื่อ = "ลีออน";
$u->ชื่อพิมพ์();
?