Apakah php meneruskan objek dengan referensi?

Referensi adalah bagian yang sangat berguna dari PHP dan, dalam hal ini, sebagian besar bahasa pemrograman lainnya. Namun, referensi bisa agak membingungkan saat Anda pertama kali mulai mempelajarinya

Tutorial ini adalah pengantar yang lembut untuk referensi di PHP. Anda mengetahui apa itu referensi, dan bagaimana cara kerjanya. Anda mempelajari cara membuat dan menghapus referensi, serta meneruskan referensi ke dan dari fungsi. Anda juga menjelajahi beberapa penggunaan referensi lainnya, dan menemukan situasi di mana PHP membuat referensi secara otomatis atas nama Anda

Apa sebenarnya referensi itu?

Referensi hanyalah cara untuk merujuk ke konten variabel menggunakan nama yang berbeda. Dalam banyak hal, referensi seperti pintasan file di Windows, alias file di Mac OS X, dan tautan simbolik di Linux

Menetapkan dengan referensi

Cara mudah untuk membuat referensi dikenal sebagai menugaskan dengan referensi. Perhatikan contoh sederhana berikut

$myVar = "Hi there";
$anotherVar = $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "Hi there"
echo $anotherVar; // Displays "See you later"

Di sini kami telah membuat variabel,

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_6, dan memberinya nilai "Halo". Kemudian kami telah menetapkan nilai itu ke variabel lain,
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7. Ini menyalin nilai dari variabel pertama ke variabel kedua

Kami kemudian mengubah nilai yang disimpan di

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_7 menjadi "Sampai jumpa". Karena 2 variabel independen,
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_6 masih mempertahankan nilai aslinya ("Halo"), yang kemudian kami tampilkan di halaman. Sejauh ini bagus

Sekarang, mari kita ubah contoh di atas untuk menetapkan

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 menjadi
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7 dengan referensi, bukan dengan nilai. Untuk melakukan ini, kami cukup meletakkan ampersand (
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
echo $myVar; // Displays "See you later"
2) setelah tanda sama dengan

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_

Sekarang Anda dapat melihat bahwa nilai

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_6 juga telah berubah menjadi "Sampai jumpa". Apa yang terjadi di sini?

Daripada menetapkan nilai

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_6 ke
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7 — yang hanya membuat 2 salinan independen dari nilai yang sama — kami membuat
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7 sebagai referensi ke nilai yang dirujuk
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6. Dengan kata lain,
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 dan
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7 sekarang keduanya menunjuk ke nilai yang sama. Jadi saat kita menetapkan nilai baru ke
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7, nilai
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 juga berubah

Perhatikan bahwa kita dapat mengubah nilai

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 menjadi "Sampai jumpa" alih-alih mengubah
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7, dan hasilnya akan persis sama. Kedua variabel tersebut, pada dasarnya, identik

Menghapus referensi

Anda menghapus referensi menggunakan fungsi

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
_4, dengan cara yang sama seperti Anda menghapus variabel reguler

Saat Anda menghapus referensi, Anda hanya menghapus referensi itu, bukan nilai yang dirujuknya

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
echo $myVar; // Displays "See you later"

Nilai tetap berada di memori sampai Anda menghapus semua referensi ke dalamnya, termasuk variabel aslinya

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""

Melewati referensi ke fungsi

Apakah php meneruskan objek dengan referensi?
Apakah php meneruskan objek dengan referensi?

Referensi benar-benar menjadi milik mereka sendiri ketika Anda mulai meneruskannya sebagai argumen ke fungsi. Biasanya, saat Anda meneruskan variabel ke suatu fungsi, fungsi tersebut menerima salinan dari nilai variabel tersebut. Namun, dengan meneruskan referensi ke suatu variabel, fungsi tersebut dapat merujuk ke — dan, yang lebih penting, memodifikasi — variabel aslinya

Untuk meneruskan argumen dengan referensi, Anda menempatkan ampersand sebelum nama parameter saat Anda menentukan fungsi

function myFunc( &$myParam ) {
  // Do something with $myParam
}

Sekarang, setiap kali Anda memanggil

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
_5 dan meneruskan variabel ke sana, PHP meneruskan referensi ke variabel, bukan nilai variabel

Mari kita lihat contoh sederhana lewat referensi

function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"

Di sini kita membuat sebuah fungsi,

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
6, yang menerima referensi ke sebuah variabel. Referensi disimpan dalam parameter
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
7. Fungsi menetapkan nilai baru (“Sampai jumpa lagi”) ke
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
7, yang mengubah nilai yang disimpan dalam variabel yang diteruskan ke fungsi

Kami menguji ini dengan membuat variabel,

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_6, dengan nilai awal "Halo", dan memanggil
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
6, meneruskan
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 dengan referensi.
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
6 lalu ubah nilai yang disimpan di
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 menjadi "Sampai jumpa"

Jadi, gunakan pass-by-reference kapan pun Anda ingin suatu fungsi mengubah variabel yang diteruskan ke sana. Sederhana

Omong-omong, jangan tergoda untuk meletakkan ampersand sebelum nama argumen dalam pemanggilan fungsi Anda

goodbye( &$myVar );  // Don't do this!

Ampersand sebelum parameter dalam definisi fungsi cukup untuk meneruskan variabel dengan referensi

Banyak fungsi PHP bawaan menggunakan referensi lewat. Misalnya, fungsi

function myFunc( &$myParam ) {
  // Do something with $myParam
}
_4 menerima referensi ke array untuk diurutkan, sehingga dapat mengubah urutan elemen dalam array

Mengembalikan referensi dari fungsi

Selain meneruskan referensi ke fungsi, Anda dapat mengembalikan referensi dari fungsi. Untuk melakukan ini, tempatkan ampersand sebelum nama fungsi saat Anda mendefinisikan fungsi. Anda juga harus menggunakan penetapan berdasarkan referensi (

function myFunc( &$myParam ) {
  // Do something with $myParam
}
5) saat menetapkan referensi yang dikembalikan ke variabel, jika tidak, Anda hanya akan menetapkan nilai, bukan referensi. Ini sebuah contoh

$numWidgets = 10;

function &getNumWidgets() {
  global $numWidgets;
  return $numWidgets;
}

$numWidgetsRef =& getNumWidgets();
$numWidgetsRef--;
echo "$numWidgets = $numWidgets<br>";  // Displays "9"
echo "$numWidgetsRef = $numWidgetsRef<br>";  // Displays "9"

Dalam contoh ini, fungsi

function myFunc( &$myParam ) {
  // Do something with $myParam
}
_6 kami mengambil variabel global
function myFunc( &$myParam ) {
  // Do something with $myParam
}
7 dan mengembalikan referensi ke sana. Kami kemudian memanggil
function myFunc( &$myParam ) {
  // Do something with $myParam
}
6, menyimpan referensi yang dikembalikan di
function myFunc( &$myParam ) {
  // Do something with $myParam
}
9, dan mengurangi nilai yang
function myFunc( &$myParam ) {
  // Do something with $myParam
}
9 menunjuk ke. Ini adalah nilai yang sama yang ditunjukkan oleh
function myFunc( &$myParam ) {
  // Do something with $myParam
}
7, seperti yang Anda lihat dari hasil pernyataan
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
2

Anda mungkin tidak akan menggunakan return-by-reference sesering pass-by-reference, tetapi dapat berguna dalam situasi tertentu, seperti saat Anda ingin menulis fungsi finder (atau metode kelas) yang menemukan variabel (atau

Menggunakan referensi untuk mengubah nilai dalam function goodbye( &$greeting ) { $greeting = "See you later"; } $myVar = "Hi there"; goodbye( $myVar ); echo $myVar; // Displays "See you later" 3 loop

Apakah php meneruskan objek dengan referensi?
Apakah php meneruskan objek dengan referensi?

Penggunaan referensi lain yang berguna adalah mengubah nilai dalam array saat menggunakan

function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3 loop. Dengan loop
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3 reguler, Anda bekerja dengan salinan nilai array, jadi jika Anda mengubah nilai, Anda tidak memengaruhi array asli. Sebagai contoh, mari kita coba mengubah array nama band menjadi huruf besar dengan
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3 loop

$bands = array( "The Who", "The Beatles", "The Rolling Stones" );

foreach ( $bands as $band ) {
  $band = strtoupper( $band );
}

echo "<pre>";
print_r( $bands );
echo "</pre>";

Contoh di atas ditampilkan

Array
(
    [0] => The Who
    [1] => The Beatles
    [2] => The Rolling Stones
)

Seperti yang Anda lihat, array asli tidak diubah oleh

function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3 loop. Namun, jika kita menempatkan ampersand sebelum
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
8 dalam pernyataan
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3 maka
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
8 menjadi referensi ke elemen array asli, bukan salinan. Kami kemudian dapat mengubah elemen array menjadi huruf besar

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_0

Kode kami sekarang berjalan sebagaimana mestinya, menghasilkan ini

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_1

Cara lain untuk mengubah nilai array dalam sebuah loop adalah dengan menggunakan

goodbye( &$myVar );  // Don't do this!
1 loop alih-alih
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3

Ketika referensi digunakan secara otomatis

Apakah php meneruskan objek dengan referensi?
Apakah php meneruskan objek dengan referensi?

Sejauh ini Anda telah melihat 4 cara untuk membuat referensi secara eksplisit

    • Menetapkan dengan referensi
    • Melewati referensi
    • Kembali dengan referensi
    • Membuat referensi dalam
      function goodbye( &$greeting ) {
        $greeting = "See you later";
      }
      
      $myVar = "Hi there";
      goodbye( $myVar );
      echo $myVar; // Displays "See you later"
      
      3 loop

Selain itu, ada kalanya PHP secara otomatis membuat referensi untuk Anda. Sebagian besar waktu Anda tidak akan peduli, tetapi akan berguna untuk mengetahui hal ini

Saat menggunakan kata kunci goodbye( &$myVar ); // Don't do this! 4

Saat Anda menggunakan

goodbye( &$myVar );  // Don't do this!
4 untuk mengakses variabel global dalam suatu fungsi, Anda sebenarnya membuat referensi ke variabel global dalam larik
goodbye( &$myVar );  // Don't do this!
6. Jadi

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_2

melakukan hal yang sama seperti

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_3

Saat menggunakan goodbye( &$myVar ); // Don't do this! _7

Saat Anda menggunakan kata kunci

goodbye( &$myVar );  // Don't do this!
7 dalam metode objek untuk merujuk ke objek, perlu diingat bahwa
goodbye( &$myVar );  // Don't do this!
7 selalu merujuk ke objek, bukan salinannya. Misalnya

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_4

Karena

goodbye( &$myVar );  // Don't do this!
_7 adalah referensi ke objek dalam contoh di atas, metode ini dapat mengubah properti di dalam objek menjadi nilai baru

Saat melewati benda-benda di sekitar

Tidak seperti jenis variabel lainnya, setiap kali Anda menetapkan, meneruskan, atau mengembalikan objek, Anda meneruskan referensi ke objek, bukan salinan. Ini biasanya yang Anda inginkan terjadi, karena fungsi atau metode yang Anda lewati objek biasanya perlu bekerja pada objek yang sebenarnya, bukan salinannya. Misalnya

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
_5

Dalam beberapa situasi ketika Anda benar-benar ingin membuat salinan objek, Anda dapat menggunakan kata kunci

$numWidgets = 10;

function &getNumWidgets() {
  global $numWidgets;
  return $numWidgets;
}

$numWidgetsRef =& getNumWidgets();
$numWidgetsRef--;
echo "$numWidgets = $numWidgets<br>";  // Displays "9"
echo "$numWidgetsRef = $numWidgetsRef<br>";  // Displays "9"
1

Bahkan, hal-hal yang sedikit lebih halus dari ini. Saat Anda membuat variabel objek, variabel itu hanya berisi pointer ke objek di memori, bukan objek itu sendiri. Saat Anda menetapkan atau meneruskan variabel itu, Anda sebenarnya membuat salinan variabel tersebut. Tapi salinan itu juga hanya penunjuk ke objek — kedua salinan itu tetap menunjuk ke objek yang sama. Oleh karena itu, untuk sebagian besar maksud dan tujuan, Anda telah membuat referensi

Ringkasan

Dalam tutorial ini Anda telah mempelajari dasar-dasar referensi variabel di PHP. Anda telah menjelajahi penugasan, penerusan, dan pengembalian variabel dengan referensi;

Jika Anda ingin mempelajari lebih lanjut, lihat bagian Penjelasan Referensi di situs web PHP. Selamat bersenang-senang. 🙂

Apakah objek dilewatkan dengan referensi?

Referensi objek diteruskan dengan nilai . Oleh karena itu, meskipun Java mengirimkan parameter ke metode dengan nilai, jika variabel menunjuk ke referensi objek, objek sebenarnya juga akan berubah.

Apakah objek disalin dengan referensi atau nilai secara default di PHP?

Objek selalu diteruskan dengan referensi , jadi jika objek asli memiliki objek lain di propertinya, salinannya akan mengarah ke objek yang sama. Perilaku ini dapat diubah dengan membuat metode __clone() di kelas.

Apakah array PHP dilewatkan dengan referensi?

Sehubungan dengan pertanyaan pertama Anda, array diteruskan dengan referensi KECUALI jika diubah dalam metode / fungsi yang Anda panggil . Jika Anda mencoba mengubah larik di dalam metode/fungsi, salinannya dibuat terlebih dahulu, baru kemudian salinannya diubah.

Bagaimana cara memberikan nilai sebagai referensi dalam PHP?

Untuk meneruskan variabel dengan referensi, perlu menambahkan simbol ampersand ( & ) sebelum argumen variabel . Contoh fungsi seperti itu akan terlihat sebagai berikut. fungsi( &$x ). Cakupan variabel global dan fungsi menjadi global. Alasannya adalah bahwa mereka didefinisikan oleh referensi yang sama.