Php lulus array dengan referensi

1) Ketika array dilewatkan sebagai argumen ke metode atau fungsi, apakah itu diteruskan dengan referensi, atau dengan nilai?

2) Saat menugaskan array ke variabel, apakah variabel baru itu referensi ke array asli, atau itu salinan baru?
Bagaimana dengan melakukan ini

$a = array(1,2,3);
$b = $a;

Apakah

<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
             // $arr1 is still array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>
_4 mengacu pada
<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
             // $arr1 is still array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>
5?

Solusi terbaik

Untuk bagian kedua dari pertanyaan Anda, lihat halaman larik dari manual, yang menyatakan (mengutip)

Penugasan array selalu melibatkan penyalinan nilai. Gunakan operator referensi untuk menyalin array dengan referensi

Dan contoh yang diberikan

<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
             // $arr1 is still array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>
_


Untuk bagian pertama, cara terbaik untuk memastikannya adalah mencoba ;-)

Perhatikan contoh kode ini

function my_func($a) {
    $a[] = 30;
}

$arr = array(10, 20);
my_func($arr);
var_dump($arr);
_

Ini akan memberikan output ini

array
  0 => int 10
  1 => int 20

Yang menunjukkan bahwa fungsi tersebut belum mengubah larik "luar" yang diteruskan sebagai parameter. itu diteruskan sebagai salinan, dan bukan referensi

Jika Anda ingin meneruskannya dengan referensi, Anda harus memodifikasi fungsinya, dengan cara ini

function my_func(& $a) {
    $a[] = 30;
}
_

Dan hasilnya akan menjadi

array
  0 => int 10
  1 => int 20
  2 => int 30

Karena, kali ini, array telah diteruskan "dengan referensi"


Jangan ragu untuk membaca bagian Penjelasan Referensi dari manual ini. itu harus menjawab beberapa pertanyaan Anda ;-)

Solusi Terkait

C++ – Apa perbedaan antara variabel pointer dan variabel referensi di C++

  1. Pointer dapat ditugaskan kembali

    int x = 5;
    int y = 6;
    int *p;
    p = &x;
    p = &y;
    *p = 10;
    assert(x == 5);
    assert(y == 10);
    
    _

    Referensi tidak dapat diikat ulang, dan harus diikat saat inisialisasi

    int x = 5;
    int y = 6;
    int &q; // error
    int &r = x;
    
    _
  2. Variabel pointer memiliki identitasnya sendiri. alamat memori yang jelas dan terlihat yang dapat diambil dengan operator

    <?php
    $arr1 = array(2, 3);
    $arr2 = $arr1;
    $arr2[] = 4; // $arr2 is changed,
                 // $arr1 is still array(2, 3)
    
    $arr3 = &$arr1;
    $arr3[] = 4; // now $arr1 and $arr3 are the same
    ?>
    
    6 unary dan sejumlah ruang yang dapat diukur dengan operator
    <?php
    $arr1 = array(2, 3);
    $arr2 = $arr1;
    $arr2[] = 4; // $arr2 is changed,
                 // $arr1 is still array(2, 3)
    
    $arr3 = &$arr1;
    $arr3[] = 4; // now $arr1 and $arr3 are the same
    ?>
    
    7. Menggunakan operator tersebut pada referensi mengembalikan nilai yang sesuai dengan referensi apa pun yang terikat; . Karena referensi mengasumsikan identitas variabel asli dengan cara ini, akan lebih mudah untuk menganggap referensi sebagai nama lain untuk variabel yang sama.

    int x = 0;
    int &r = x;
    int *p = &x;
    int *p2 = &r;
    
    assert(p == p2); // &x == &r
    assert(&p != &p2);
    
  3. Anda dapat memiliki pointer bersarang secara sewenang-wenang ke pointer yang menawarkan tingkat tipuan ekstra. Referensi hanya menawarkan satu tingkat tipuan

    int x = 0;
    int y = 0;
    int *p = &x;
    int *q = &y;
    int **pp = &p;
    
    **pp = 2;
    pp = &q; // *pp is now q
    **pp = 4;
    
    assert(y == 4);
    assert(x == 2);
    
  4. Pointer dapat diberikan

    <?php
    $arr1 = array(2, 3);
    $arr2 = $arr1;
    $arr2[] = 4; // $arr2 is changed,
                 // $arr1 is still array(2, 3)
    
    $arr3 = &$arr1;
    $arr3[] = 4; // now $arr1 and $arr3 are the same
    ?>
    
    _8, sedangkan referensi harus terikat ke objek yang ada. Jika Anda berusaha cukup keras, Anda dapat mengikat referensi ke
    <?php
    $arr1 = array(2, 3);
    $arr2 = $arr1;
    $arr2[] = 4; // $arr2 is changed,
                 // $arr1 is still array(2, 3)
    
    $arr3 = &$arr1;
    $arr3[] = 4; // now $arr1 and $arr3 are the same
    ?>
    
    8, tetapi ini tidak ditentukan dan tidak akan berperilaku konsisten

    <?php
    $arr1 = array(2, 3);
    $arr2 = $arr1;
    $arr2[] = 4; // $arr2 is changed,
                 // $arr1 is still array(2, 3)
    
    $arr3 = &$arr1;
    $arr3[] = 4; // now $arr1 and $arr3 are the same
    ?>
    
    _0

    Namun, Anda dapat memiliki referensi ke penunjuk yang nilainya

    <?php
    $arr1 = array(2, 3);
    $arr2 = $arr1;
    $arr2[] = 4; // $arr2 is changed,
                 // $arr1 is still array(2, 3)
    
    $arr3 = &$arr1;
    $arr3[] = 4; // now $arr1 and $arr3 are the same
    ?>
    
    8

  5. Pointer dapat beralih ke array; . Ini tidak peduli berapa pun ukuran objek yang ditunjuk penunjuk

  6. Pointer perlu direferensikan dengan

    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    3 untuk mengakses lokasi memori yang ditunjuknya, sedangkan referensi dapat digunakan secara langsung. Pointer ke kelas/struct menggunakan
    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    4 untuk mengakses anggotanya sedangkan referensi menggunakan
    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    5

  7. Referensi tidak dapat dimasukkan ke dalam array, sedangkan pointer dapat (Disebutkan oleh pengguna @litb)

  8. Referensi const dapat diikat ke temporer. Pointer tidak bisa (bukan tanpa tipuan)

    <?php
    $arr1 = array(2, 3);
    $arr2 = $arr1;
    $arr2[] = 4; // $arr2 is changed,
                 // $arr1 is still array(2, 3)
    
    $arr3 = &$arr1;
    $arr3[] = 4; // now $arr1 and $arr3 are the same
    ?>
    
    _1

    Ini membuat

    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    _6 lebih nyaman digunakan dalam daftar argumen dan sebagainya

Javascript – Cara memeriksa apakah array menyertakan nilai dalam JavaScript

Browser modern memiliki , yang melakukan hal itu dan oleh semua orang kecuali IE

<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
             // $arr1 is still array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>
_2

Anda juga dapat menggunakan

function my_func($a) {
    $a[] = 30;
}

$arr = array(10, 20);
my_func($arr);
var_dump($arr);
8, yang kurang langsung, tetapi tidak memerlukan polyfill untuk browser usang

<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
             // $arr1 is still array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>
_3


Banyak kerangka kerja juga menawarkan metode serupa

  • jQuery.
    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    _9
  • Menggarisbawahi. js. (juga disebut sebagai
    array
      0 => int 10
      1 => int 20
    
    _1 dan
    array
      0 => int 10
      1 => int 20
    
    2)
  • Perangkat Dojo.
    array
      0 => int 10
      1 => int 20
    
    _3
  • Prototipe.
    array
      0 => int 10
      1 => int 20
    
    _4
  • MooTools.
  • MochiKit.
  • MS Ajax.
    array
      0 => int 10
      1 => int 20
    
    _4
  • Ext.
  • Lodash. (adalah
    function my_func(& $a) {
        $a[] = 30;
    }
    
    _0 sebelum 4. 0. 0)
  • Ramda.

Perhatikan bahwa beberapa framework mengimplementasikan ini sebagai fungsi, sementara yang lain menambahkan fungsi tersebut ke prototipe array

Bagaimana cara melewatkan array sebagai referensi di PHP?

Saat array diteruskan ke metode atau fungsi dalam PHP, array diteruskan dengan nilai kecuali Anda secara eksplisit meneruskannya dengan referensi , seperti . function test(&$array) { $array['new'] = 'hei';

Bisakah Anda melewati referensi di PHP?

Dalam PHP, argumen ke suatu fungsi dapat diteruskan dengan nilai atau diteruskan dengan referensi . Secara default, nilai argumen aktual diteruskan dengan nilai ke argumen formal yang menjadi variabel lokal di dalam fungsi. Oleh karena itu, modifikasi pada variabel-variabel ini tidak mengubah nilai variabel argumen yang sebenarnya.

Apakah PHP melewati nilai atau referensi?

Itu berdasarkan nilai menurut Dokumentasi PHP. Secara default, argumen fungsi diteruskan dengan nilai (sehingga jika nilai argumen di dalam fungsi diubah, nilai itu tidak akan berubah di luar fungsi). Untuk mengizinkan fungsi memodifikasi argumennya, mereka harus diteruskan dengan referensi.

Bagaimana cara melewatkan array sebagai parameter di PHP?

Anda dapat melewatkan array sebagai argumen. Ini disalin berdasarkan nilai (atau COW'd, yang pada dasarnya memiliki arti yang sama bagi Anda) , sehingga Anda dapat array_pop() (dan sejenisnya) semua yang Anda inginkan . fungsi sendemail($id, $userid){ //. } sendemail(array('a', 'b', 'c'), 10);