Tham chiếu truyền qua mảng PHP

1) Khi một mảng được truyền dưới dạng đối số cho một phương thức hoặc hàm, thì nó được truyền theo tham chiếu hay theo giá trị?

2) Khi gán một mảng cho một biến, biến mới có tham chiếu đến mảng ban đầu hay là một bản sao mới?
làm cái này thì sao

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

Có phải


4 là tham chiếu đến

5 không?

Giải pháp tốt nhất

Đối với phần thứ hai của câu hỏi của bạn, hãy xem trang mảng của sách hướng dẫn, trong đó nêu rõ (trích dẫn)

Việc gán mảng luôn liên quan đến việc sao chép giá trị. Sử dụng toán tử tham chiếu để sao chép một mảng theo tham chiếu

Và ví dụ đã cho



Đối với phần đầu tiên, cách tốt nhất để chắc chắn là thử ;-)

Hãy xem xét ví dụ về mã này

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

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

Nó sẽ cho đầu ra này

array
  0 => int 10
  1 => int 20

Điều này cho biết hàm chưa sửa đổi mảng "bên ngoài" được truyền dưới dạng tham số. nó được chuyển dưới dạng bản sao và không phải là tài liệu tham khảo

Nếu bạn muốn nó được chuyển qua tham chiếu, bạn sẽ phải sửa đổi chức năng theo cách này

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

Và đầu ra sẽ trở thành

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

Vì, lần này, mảng đã được chuyển "theo tham chiếu"


Đừng ngần ngại đọc phần Giải thích tài liệu tham khảo của sách hướng dẫn. nó sẽ trả lời một số câu hỏi của bạn ;-)

Giải pháp liên quan

C++ – Sự khác nhau giữa biến con trỏ và biến tham chiếu trong C++

  1. Một con trỏ có thể được gán lại

    ________số 8_______

    Một tham chiếu không thể bị ràng buộc lại và phải được ràng buộc khi khởi tạo

    int x = 5;
    int y = 6;
    int &q; // error
    int &r = x;
    
  2. Một biến con trỏ có bản sắc riêng của nó. một địa chỉ bộ nhớ riêng biệt, có thể nhìn thấy có thể được lấy bằng toán tử một ngôi

    
    
    6 và một lượng không gian nhất định có thể được đo bằng toán tử
    
    
    7. Sử dụng các toán tử đó trên một tham chiếu sẽ trả về một giá trị tương ứng với bất kỳ tham chiếu nào được liên kết với; . Vì tham chiếu giả định danh tính của biến ban đầu theo cách này, nên sẽ thuận tiện khi coi tham chiếu như một tên khác cho cùng một biến

    int x = 0;
    int &r = x;
    int *p = &x;
    int *p2 = &r;
    
    assert(p == p2); // &x == &r
    assert(&p != &p2);
    
  3. Bạn có thể có các con trỏ lồng vào nhau tùy ý tới các con trỏ cung cấp thêm các cấp độ định hướng. Tài liệu tham khảo chỉ cung cấp một mức độ gián tiếp

    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. Một con trỏ có thể được gán

    
    
    8, trong khi một tham chiếu phải được liên kết với một đối tượng hiện có. Nếu bạn đủ cố gắng, bạn có thể liên kết một tham chiếu tới
    
    
    8, nhưng điều này không được xác định và sẽ không hoạt động nhất quán

    
    
    0

    Tuy nhiên, bạn có thể có một tham chiếu đến một con trỏ có giá trị là

    
    
    8

  5. Con trỏ có thể lặp qua một mảng; . Đây là bất kể kích thước của đối tượng mà con trỏ trỏ tới

  6. Một con trỏ cần được hủy đăng ký bằng

    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    3 để truy cập vị trí bộ nhớ mà nó trỏ tới, trong khi một tham chiếu có thể được sử dụng trực tiếp. Một con trỏ tới một lớp/cấu trúc sử dụng
    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    4 để truy cập các thành viên của nó trong khi một tham chiếu sử dụng một
    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    5

  7. Các tham chiếu không thể được đưa vào một mảng, trong khi các con trỏ có thể được (Được đề cập bởi người dùng @litb)

  8. Const tài liệu tham khảo có thể được ràng buộc tạm thời. Con trỏ không thể (không phải không có một số gián tiếp)

    
    
    1

    Điều này làm cho

    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    6 thuận tiện hơn để sử dụng trong danh sách đối số, v.v.

Javascript – Cách kiểm tra xem một mảng có chứa giá trị hay không trong JavaScript

Các trình duyệt hiện đại có , cái này thực hiện chính xác điều đó và bởi tất cả mọi người ngoại trừ IE


2

Bạn cũng có thể sử dụng

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

$arr = array(10, 20);
my_func($arr);
var_dump($arr);
8, cách này ít trực tiếp hơn nhưng không yêu cầu polyfill cho các trình duyệt lỗi thời


3


Nhiều khung cũng cung cấp các phương pháp tương tự

  • jQuery.
    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    9
  • dấu gạch dưới. js. (cũng có bí danh là
    array
      0 => int 10
      1 => int 20
    
    1 và
    array
      0 => int 10
      1 => int 20
    
    2)
  • Bộ công cụ Dojo.
    array
      0 => int 10
      1 => int 20
    
    3
  • Nguyên mẫu.
    array
      0 => int 10
      1 => int 20
    
    4
  • MooTools.
  • MochiKit.
  • MS Ajax.
    array
      0 => int 10
      1 => int 20
    
    4
  • mở rộng.
  • Lodash. (là
    function my_func(& $a) {
        $a[] = 30;
    }
    
    0 trước 4. 0. 0)
  • Ramda.

Lưu ý rằng một số khung triển khai chức năng này dưới dạng hàm, trong khi các khung khác thêm chức năng vào nguyên mẫu mảng

PHP có vượt qua giá trị hoặc tham chiếu không?

Đó là theo giá trị theo Tài liệu PHP. Theo mặc định, các đối số của hàm được truyền theo giá trị (để nếu giá trị của đối số bên trong hàm bị thay đổi, nó sẽ không bị thay đổi bên ngoài hàm). Để cho phép một hàm sửa đổi các đối số của nó, chúng phải được chuyển qua tham chiếu.

Làm cách nào để chuyển tham số theo tham chiếu trong PHP?

Chuyển theo tham chiếu . Một ví dụ về một chức năng như vậy sẽ như sau. hàm( &$x ). Phạm vi của các biến toàn cục và hàm trở thành toàn cầu. add the ampersand ( & ) symbol before the argument of the variable. An example of such a function will look as follows: function( &$x ). The scope of the global and function variables becomes global.

Mảng có được truyền qua tham chiếu không?

Giống như tất cả các đối tượng Java, mảng được truyền theo giá trị . nhưng giá trị là tham chiếu đến mảng. Chuyển thực theo tham chiếu liên quan đến việc chuyển địa chỉ của một biến để biến đó có thể được cập nhật. Đây KHÔNG phải là điều xảy ra khi bạn chuyển một mảng trong Java.

Làm cách nào để chuyển một đối số cho một mảng trong PHP?

Bạn có thể truyền một mảng làm đối số . Nó được sao chép theo giá trị (hoặc COW'd, về cơ bản có nghĩa giống với bạn), vì vậy bạn có thể array_pop() (và tương tự) tất cả những gì bạn thích trên đó và sẽ không ảnh hưởng đến bất kỳ thứ gì bên ngoài. hàm sendemail($id, $userid){ //. } sendemail(mảng('a', 'b', 'c'), 10);