การเริ่มฟังก์ชั่น PHP ด้วยแอมเปอร์แซนด์หมายความว่าอย่างไร?


129

ฉันใช้ห้องสมุด Facebook กับรหัสนี้:

class FacebookRestClient {
...
    public function &users_hasAppPermission($ext_perm, $uid=null) {
        return $this->call_method('facebook.users.hasAppPermission', 
        array('ext_perm' => $ext_perm, 'uid' => $uid));
    }
...
}

& ที่จุดเริ่มต้นของนิยามฟังก์ชันหมายถึงอะไรและฉันจะใช้ไลบรารีแบบนี้ได้อย่างไร (ในตัวอย่างง่าย ๆ )

คำตอบ:


157

เครื่องหมายแอมเปอร์แซนด์ก่อนชื่อฟังก์ชันหมายความว่าฟังก์ชันจะส่งคืนการอ้างอิงไปยังตัวแปรแทนที่จะเป็นค่า

การส่งคืนโดยการอ้างอิงมีประโยชน์เมื่อคุณต้องการใช้ฟังก์ชั่นเพื่อค้นหาตัวแปรที่การอ้างอิงควรถูกผูกไว้ อย่าใช้ Return-by-Reference เพื่อเพิ่มประสิทธิภาพ เครื่องยนต์จะปรับแต่งสิ่งนี้เองโดยอัตโนมัติ ส่งคืนการอ้างอิงเมื่อคุณมีเหตุผลทางเทคนิคที่ถูกต้องเท่านั้น

ดูเอกสารอ้างอิงที่ส่งคืน


1
ดังนั้นโดยไม่ต้องลงรายละเอียดมากเกินไปคุณจะเรียก (ด้วยคลาสอินสแตนซ์) บางอย่างเช่น $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2); ? ฉันคิดว่าฉันไม่แน่ใจถึงความแตกต่างที่นี่ขอบคุณสำหรับความช่วยเหลือ
Alex Mcp

2
ใช่ - ฉันแค่เรียกมันว่าอย่างนั้น
Dominic Rodger

16

กำลังส่งคืนข้อมูลอ้างอิงตามที่กล่าวถึงแล้ว ใน PHP 4 วัตถุถูกกำหนดโดยค่าเช่นเดียวกับค่าอื่น ๆ สิ่งนี้ไม่ได้ใช้งานง่ายและขัดกับการทำงานของภาษาอื่น ๆ

เพื่อแก้ไขปัญหาการอ้างอิงถูกใช้สำหรับตัวแปรที่ชี้ไปยังวัตถุ ใน PHP 5 มีการใช้การอ้างอิงน้อยมาก ฉันคาดเดาว่านี่เป็นรหัสเดิมหรือรหัสที่พยายามรักษาความเข้ากันได้ย้อนหลังกับ PHP 4


มันเป็นห้องสมุด Facebook PHP อย่างเป็นทางการ FWIW
Alex Mcp

4
@Alex: ในกรณีนั้นพวกเขาอาจจะทำเพื่อปกป้องแฮกเกอร์ที่ใช้ php4 จากพวกเขาเอง คุณไม่ควรทำสิ่งนี้ในรหัสของคุณ - มันเลิกใช้แล้ว
troelskn

3
"นี่ไม่ได้ใช้งานง่ายมากและตรงกันข้ามกับภาษาอื่น ๆ ส่วนใหญ่ทำงาน" ฉันไม่เห็นด้วยอีกต่อไป
การแข่งขัน Lightness ใน Orbit

5
@WildlyInaccurate: การกำหนดวัตถุโดยการอ้างอิงโดยค่าเริ่มต้นซึ่งเป็นสิ่งที่เกิดขึ้นใน. NET และใน Java (ฉันคิดว่า) นั้นไม่ได้ใช้งานง่ายมาก ในภาษาอื่น ๆ ส่วนใหญ่การถ่ายโอนจะทำโดยการคัดลอกไม่ว่าคุณจะมี "วัตถุ" หรือดั้งเดิมหรืออะไรก็ตามและเนื่องจากเป็นเช่นนี้มาตั้งแต่เช้าตรู่นี่คือสิ่งที่โลกควรจะติดอยู่
การแข่งขัน Lightness ใน Orbit

4
ไม่ว่าจะเป็นสิ่งที่ใช้งานง่ายอาจเป็นเรื่องส่วนตัว แต่สำหรับภาษาที่มีความคล้ายคลึงกับ PHP บรรทัดฐานคือการส่งวัตถุโดยการอ้างอิง ในเรื่องที่เกี่ยวกับ OOP ฉันจะบอกว่าเป็นวิธีที่ใช้งานง่ายที่สุดเนื่องจาก OOP เป็นเรื่องเกี่ยวกับสภาพห่อหุ้มดังนั้นโปรแกรมมักจะอ้างถึงสถานะนั้นมากกว่าที่จะทำการโคลนนิ่ง
troelskn

4

นี้มักจะเป็นที่รู้จักกันใน PHP เป็นกลับอ้างอิงหรือกลับโดยการอ้างอิง

การส่งคืนโดยการอ้างอิงมีประโยชน์เมื่อคุณต้องการใช้ฟังก์ชั่นเพื่อค้นหาตัวแปรที่การอ้างอิงควรถูกผูกไว้ อย่าใช้ Return-by-Reference เพื่อเพิ่มประสิทธิภาพ เครื่องยนต์จะปรับแต่งสิ่งนี้เองโดยอัตโนมัติ ส่งคืนการอ้างอิงเมื่อคุณมีเหตุผลทางเทคนิคที่ถูกต้องเท่านั้น

เอกสาร PHP เกี่ยวกับการอ้างอิงที่ส่งคืน

การอ้างอิงใน PHP เป็นเพียงชื่ออื่นที่กำหนดให้กับเนื้อหาของตัวแปร การอ้างอิง PHP ไม่เหมือนกับตัวชี้ในการเขียนโปรแกรม Cแต่ไม่ใช่ที่อยู่หน่วยความจำจริงดังนั้นจึงไม่สามารถใช้สำหรับตัวชี้เลขคณิตได้

แนวคิดของการอ้างอิงกลับอาจสร้างความสับสนอย่างมากโดยเฉพาะกับผู้เริ่มต้นดังนั้นตัวอย่างจะมีประโยชน์

$populationCount = 120;

function &getPopulationCount() {
  global $populationCount;
  return $populationCount;
}

$countryPopulation =& getPopulationCount();
$countryPopulation++;
echo "\$populationCount = $populationCount\n"; // Output: $populationCount = 121 
echo "\$countryPopulation = $countryPopulation\n"; //Output: $countryPopulation = 121 

ฟังก์ชั่นgetPopulationCount()ที่กำหนดไว้ก่อนหน้านี้ที่มีผลตอบแทนอ้างอิงกับเนื้อหาหรือค่าของ& $populationCountดังนั้นการเพิ่มยังเพิ่มขึ้น$countryPopulation$populationCount

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