ดังที่ได้กล่าวมาแล้วคุณจะไม่สามารถข้ามพารามิเตอร์ได้ ฉันได้เขียนคำตอบนี้เพื่อระบุภาคผนวกซึ่งมีขนาดใหญ่เกินกว่าที่จะใส่ความคิดเห็นได้
@ Frank Nocke เสนอให้เรียกใช้ฟังก์ชันด้วยพารามิเตอร์เริ่มต้นตัวอย่างเช่นมีไฟล์
function a($b=0, $c=NULL, $d=''){
คุณควรใช้
$var = a(0, NULL, 'ddd');
ซึ่งจะทำงานเหมือนกับการละเว้นพารามิเตอร์สองตัวแรก ( $b
และ$c
)
ไม่ชัดเจนว่าค่าใดเป็นค่าเริ่มต้น ( 0
พิมพ์เพื่อระบุค่าเริ่มต้นหรือว่าสำคัญ?)
นอกจากนี้ยังมีอันตรายที่ปัญหาค่าเริ่มต้นเชื่อมต่อกับฟังก์ชันภายนอก (หรือในตัว) เมื่อค่าเริ่มต้นสามารถเปลี่ยนแปลงได้โดยผู้เขียนฟังก์ชัน (หรือวิธีการ) ดังนั้นหากคุณไม่เปลี่ยนการโทรของคุณในโปรแกรมคุณสามารถเปลี่ยนพฤติกรรมของมันได้โดยไม่ได้ตั้งใจ
วิธีแก้ปัญหาบางอย่างอาจเป็นการกำหนดค่าคงที่ส่วนกลางบางค่าDEFAULT_A_B
ซึ่งจะเป็น "ค่าเริ่มต้นของพารามิเตอร์ B ของฟังก์ชัน A" และ "ละเว้น" ด้วยวิธีนี้:
$var = a(DEFAULT_A_B, DEFAULT_A_C, 'ddd');
สำหรับคลาสจะง่ายกว่าและสวยงามกว่าถ้าคุณกำหนดค่าคงที่ของคลาสเนื่องจากเป็นส่วนหนึ่งของขอบเขตทั่วโลกเช่น
class MyObjectClass {
const DEFAULT_A_B = 0;
function a($b = self::DEFAULT_A_B){
}
}
$obj = new MyObjectClass();
$var = $obj->a(MyObjectClass::DEFAULT_A_B);
โปรดทราบว่าค่าคงที่เริ่มต้นนี้ถูกกำหนดเพียงครั้งเดียวตลอดทั้งโค้ด (ไม่มีค่าแม้แต่ในการประกาศวิธีการ) ดังนั้นในกรณีที่มีการเปลี่ยนแปลงที่ไม่คาดคิดคุณจะต้องระบุฟังก์ชัน / วิธีการด้วยค่าเริ่มต้นที่ถูกต้องเสมอ
ความชัดเจนของการแก้ปัญหานี้เป็นหลักสูตรที่ดีกว่าการจัดหาวัตถุดิบค่าเริ่มต้น (เช่นNULL
, 0
ฯลฯ ) ซึ่งบอกเล่าอะไรให้ผู้อ่าน
(ฉันยอมรับว่าการเรียกไลค์$var = a(,,'ddd');
จะเป็นตัวเลือกที่ดีที่สุด)