PHP และการอ้างอิงค่อนข้างใช้งานง่าย หากใช้การอ้างอิงอย่างเหมาะสมในสถานที่ที่เหมาะสมสามารถให้การปรับปรุงประสิทธิภาพขนาดใหญ่หรือหลีกเลี่ยงการแก้ไขปัญหาที่น่าเกลียดมากและรหัสที่ผิดปกติ
ต่อไปนี้จะทำให้เกิดข้อผิดพลาด:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
สิ่งเหล่านี้ไม่ต้องล้มเหลวเนื่องจากสามารถปฏิบัติตามกฎด้านล่างได้ แต่ไม่ต้องสงสัยเลยว่าถูกลบหรือปิดใช้งานเพื่อป้องกันความสับสนในเรื่องมรดก
หากพวกเขาทำงานทั้งสองเกี่ยวข้องกับการแปลงซ้ำซ้อนเพื่อการอ้างอิงและครั้งที่สองเกี่ยวข้องกับการแปลงซ้ำซ้อนกลับไปเป็นตัวแปรที่มีขอบเขต
คนที่สองเคยเป็นไปได้ที่อนุญาตให้ส่งการอ้างอิงไปยังโค้ดที่ไม่ได้ตั้งใจจะทำงานกับการอ้างอิง มันน่าเกลียดอย่างยิ่งสำหรับการบำรุงรักษา
สิ่งนี้จะไม่ทำสิ่งใด:
function f($v){$v = true;}
$r = &$v;
f($r);
โดยเฉพาะอย่างยิ่งมันจะเปลี่ยนการอ้างอิงกลับเป็นตัวแปรปกติในขณะที่คุณยังไม่ได้ขอการอ้างอิง
สิ่งนี้จะได้ผล:
function f(&$v){$v = true;}
f($v);
สิ่งนี้เห็นว่าคุณกำลังผ่านการไม่อ้างอิง แต่ต้องการการอ้างอิงดังนั้นเปลี่ยนเป็นการอ้างอิง
สิ่งนี้หมายความว่าคุณไม่สามารถส่งต่อการอ้างอิงไปยังฟังก์ชันที่ไม่ได้ขอการอ้างอิงอย่างชัดเจนเพื่อให้เป็นหนึ่งในไม่กี่พื้นที่ที่ PHP เข้มงวดในการส่งผ่านประเภทหรือในกรณีนี้มีเมตาดาต้ามากกว่า
หากคุณต้องการพฤติกรรมแบบไดนามิกมากกว่านี้จะทำงาน:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
ที่นี่จะเห็นว่าคุณต้องการการอ้างอิงและมีการอ้างอิงอยู่แล้วจึงทิ้งไว้คนเดียว มันอาจโยงการอ้างอิง แต่ฉันสงสัยในเรื่องนี้