Apa artinya memulai fungsi PHP dengan ampersand?

129

Saya menggunakan perpustakaan Facebook dengan kode ini di dalamnya:

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

Apa yang dimaksud dengan & di awal definisi fungsi, dan bagaimana cara menggunakan perpustakaan seperti ini (dalam contoh sederhana)

Alex Mcp
sumber

Jawaban:

157

Sebuah ampersand sebelum nama fungsi berarti fungsi tersebut akan mengembalikan referensi ke variabel bukan nilai.

Mengembalikan dengan referensi berguna ketika Anda ingin menggunakan fungsi untuk menemukan variabel mana yang harus diikat oleh variabel. Jangan gunakan kembali dengan referensi untuk meningkatkan kinerja. Mesin akan secara otomatis mengoptimalkan ini sendiri. Hanya kembalikan referensi bila Anda memiliki alasan teknis yang valid untuk melakukannya.

Lihat Mengembalikan Referensi .

Dominic Rodger
sumber
1
Jadi, tanpa masuk ke detail terlalu, Anda akan memanggil (dengan kelas instantiated) sesuatu seperti $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2); ? Saya kira saya tidak yakin dengan nuansa di sini, terima kasih atas bantuannya.
Alex Mcp
2
Yap - Saya akan menyebutnya seperti itu.
Dominic Rodger
16

Ini mengembalikan referensi, seperti yang sudah disebutkan. Di PHP 4, objek diberi nilai, sama seperti nilai lainnya. Ini sangat tidak intuitif dan bertentangan dengan cara kerja sebagian besar bahasa lain.

Untuk mengatasi masalah, referensi digunakan untuk variabel yang menunjuk ke objek. Dalam PHP 5, referensi sangat jarang digunakan. Saya menduga ini adalah kode lama atau kode yang mencoba mempertahankan kompatibilitas dengan PHP 4.

troelskn
sumber
Ini adalah perpustakaan PHP Facebook resmi, FWIW.
Alex Mcp
4
@Alex: Dalam hal itu, mereka mungkin melakukannya untuk melindungi peretas kasual, yang menggunakan php4, dari diri mereka sendiri. Anda seharusnya tidak melakukan ini dalam kode Anda sendiri - Sudah usang.
troelskn
3
"Ini sangat tidak intuitif dan bertentangan dengan cara kerja sebagian besar bahasa lain" Saya tidak bisa tidak setuju lagi.
Lightness Races di Orbit
5
@ WildlyInaccurate: Menetapkan objek dengan referensi secara default, yang adalah apa yang terjadi di .NET dan di Jawa (saya pikir), sangat tidak intuitif. Dalam sebagian besar bahasa lain, penugasan dilakukan dengan menyalin, apakah Anda memiliki "objek" atau primitif atau apa pun, dan karena ini telah menjadi kasus sejak awal waktu, inilah yang seharusnya dunia tempati.
Lightness Races in Orbit
4
Apakah sesuatu itu intuitif mungkin agak subyektif. Tetapi untuk bahasa yang sebaliknya mirip dengan PHP, normanya adalah untuk melewatkan objek dengan referensi. Berkenaan dengan OOP, saya akan mengatakan itu adalah cara yang paling intuitif, karena OOP adalah tentang keadaan enkapsulasi, jadi program biasanya merujuk pada keadaan itu, daripada mengkloningnya.
troelskn
4

Ini sering dikenal dalam PHP sebagai Pengembalian referensi atau Pengembalian dengan referensi .

Mengembalikan dengan referensi berguna ketika Anda ingin menggunakan fungsi untuk menemukan variabel mana yang harus diikat oleh variabel. Jangan gunakan kembali dengan referensi untuk meningkatkan kinerja. Mesin akan secara otomatis mengoptimalkan ini sendiri. Hanya kembalikan referensi bila Anda memiliki alasan teknis yang valid untuk melakukannya.

Dokumentasi PHP tentang referensi Pengembalian

Sebuah referensi di PHP hanya nama lain ditugaskan untuk isi variabel. Referensi PHP tidak seperti pointer dalam pemrograman C , mereka bukan alamat memori yang sebenarnya, sehingga mereka tidak dapat digunakan untuk aritmatika pointer.

Konsep pengembalian referensi bisa sangat membingungkan terutama untuk pemula, jadi sebuah contoh akan sangat membantu.

$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 

Fungsi yang getPopulationCount()didefinisikan dengan pendahulunya &, mengembalikan referensi ke konten atau nilai $populationCount. Jadi, kenaikan $countryPopulation, juga kenaikan $populationCount.

Elisha Senoo
sumber