ตัวดำเนินการกำหนดค่าอ้างอิงใน PHP, = &


คำตอบ:


121

ยังไม่เลิกใช้งานและไม่น่าจะเป็นไปได้ เป็นวิธีมาตรฐานในการสร้างส่วนหนึ่งของอาร์เรย์หนึ่งหรือการเปลี่ยนแปลงมิเรอร์อ็อบเจ็กต์ไปยังอีกอันหนึ่งแทนที่จะคัดลอกข้อมูลที่มีอยู่

เรียกว่าการกำหนดโดยการอ้างอิงซึ่งหากต้องการอ้างอิงคู่มือ"หมายความว่าตัวแปรทั้งสองลงเอยด้วยการชี้ไปที่ข้อมูลเดียวกันและไม่มีการคัดลอกที่ใดเลย"

สิ่งเดียวที่จะเลิกกับ=&คือ "การกำหนดผลของnewการอ้างอิง" ในPHP 5ซึ่งอาจจะเป็นแหล่งที่มาของความสับสนใด ๆ newที่ได้รับมอบหมายโดยอัตโนมัติโดยการอ้างอิงเพื่อให้&ซ้ำซ้อน / เลิกใช้ในแต่ไม่ได้อยู่ใน$o = &new C;$o = &$c;


เนื่องจากเป็นการยากที่จะค้นหาโปรดทราบว่า=&( เท่ากับเครื่องหมายแอมเปอร์แซนด์ ) เหมือนกับ= &( เท่ากับเครื่องหมายวรรคตอน ) และมักจะเขียนในลักษณะที่รันในตัวแปรอื่นเช่น$x = &$y['z'];หรือ$x = &$someVar( ชื่อตัวแปรเครื่องหมายแอมเพอร์แซนด์ ) ตัวอย่างที่ง่ายขึ้นจากเอกสาร:

$a = 3;
$b = &$a;
$a = 4;
print "$b"; // prints 4

นี่คือการเชื่อมโยงที่มีประโยชน์ไปยังส่วนรายละเอียดเกี่ยวกับการกำหนดโดยการอ้างอิงในคู่มือของ PHP หน้านั้นเป็นส่วนหนึ่งของชุดข้อมูลอ้างอิง - ควรใช้เวลาสักนาทีในการอ่านทั้งชุด


8
หมายเหตุด้านข้าง re: "เนื่องจากมันยากที่จะค้นหา" : symbolhound.comเป็นเพื่อนของคุณสำหรับสิ่งต่างๆเช่นนี้
billynoah

1
@billynoah ว้าว! Symbolhound ถูกเพิ่มลงในกล่องเครื่องมือของฉันอย่างถาวรแล้ว
Parapluie

26

เป็นตัวดำเนินการสองตัวที่แตกต่างกัน =คือการมอบหมายงานอย่างที่คุณคงทราบดี และ&หมายความว่าตัวแปรควรเข้าถึงโดยการอ้างอิงมากกว่าตามค่า


60
ฉันขอโทษ แต่นี่เป็นวิธีที่ง่ายเกินไป $ a = & $ b หมายถึงการทำให้ตัวแปร $ อ้างอิงถึงสิ่งเดียวกับที่ $ b ทำในตอนนี้ หลังจากนี้ $ a = 5; จะส่งผลให้ $ b มี 5 อย่างไรก็ตามลิงก์อ้างอิงอาจถูกทำลายโดย $ b = & $ xyz; หรือยกเลิกการตั้งค่า ($ b); ซึ่งในเวลานั้น $ a จะเป็นตัวแปรเดียวที่รู้ว่าเซลล์อยู่ที่ใดซึ่งถือ 5 นอกจากนี้โปรดระวังด้วยว่าหากคุณตั้งค่า $ a โดยใช้ = & คุณต้องใช้ = & ในครั้งต่อไป (หรือ unset ($ a)) เพื่อเปลี่ยน ลิงค์อ้างอิงของ $ a โดยเฉพาะ $ a = NULL; จะไม่ทำลายลิงค์มันจะแทนที่ 5 ด้วย null เท่านั้น
ดอน

8
@ ดอน: ขอบคุณสำหรับความละเอียด ฉันบอกได้เลยว่าคุณเป็นโปรแกรมเมอร์ C
Asaph

8
ฉันสองสิ่งที่ดอนพูด แต่ฉันจะไม่บอกว่ามันง่ายเกินไป ฉันจะบอกว่านี่ผิด
Artefacto

@ คุณควรโพสต์ความคิดเห็นของคุณเป็นคำตอบจริงๆ
Adam

7
$x = &$y['z'];

นอกจากนี้ยังมีผลกระทบจากการสร้างถ้ามันไม่ได้อยู่และการตั้งค่าให้$y['z']null

ซึ่งจะป้องกันข้อความแสดงข้อผิดพลาดที่คุณอาจต้องการอ่าน ฉันยังไม่พบเอกสารเกี่ยวกับเรื่องนี้ อาจจะใหม่ใน 5.3 สำหรับทุกสิ่งที่ฉันรู้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.