2012-01-17 33 views
6

thể trùng lặp:
are arrays in php passed by value or by reference?mảng php gán bằng cách sao chép giá trị hoặc tham chiếu?

Tôi nghe nói rằng PHP có thể chọn cách gán mảng, phụ thuộc vào kích thước mảng. Nó có thể gán bằng cách sao chép giá trị (như bất kỳ loại vô hướng nào) hoặc bằng cách tham chiếu.

PHP luôn gán mảng cho biến bằng cách sao chép giá trị, như được nói trong sách hướng dẫn.

Hoặc nó có thể gán theo tham chiếu. ?

<?php $a = array(1,2,3); ?> 
+0

Bạn chỉ muốn biết nếu nó có thể gán một mảng bằng tài liệu tham khảo? Hoặc bạn có muốn biết nếu có một số cách để thiết lập nó để làm điều đó tự động? – jprofitt

+0

tôi muốn biết, rằng đôi khi động cơ PHP có thể vượt qua $ a = mảng (1,2,3); $ b = $ a; bằng cách tham chiếu không có ký hiệu '&'. – RusAlex

Trả lời

12

Bạn không thể chỉ định điều gì đó bằng tham chiếu trừ khi bạn đang tham chiếu đến nội dung đã tồn tại. Tương tự, bạn không thể sao chép thứ gì đó không tồn tại.

Vì vậy, mã này:

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

... không phải bản sao hoặc tài liệu tham khảo - nó chỉ tạo ra một mảng mới lấp đầy nó với các giá trị, vì các giá trị được quy định theo nghĩa đen.

Tuy nhiên, mã này:

$x = 1; 
$y = 2; 
$z = 3; 
$a = array($x,$y,$z); 

... bản sao các giá trị từ $x, $y$z vào một mảng . Các biến được sử dụng để khởi tạo các giá trị mảng vẫn tồn tại ở bên phải của riêng chúng, và có thể được sửa đổi hoặc hủy bỏ mà không ảnh hưởng đến các giá trị trong mảng.

Mã này:

$x = 1; 
$y = 2; 
$z = 3; 
$a = array(&$x,&$y,&$z); 

... tạo ra một loạt các tài liệu tham khảo để $x, $y$z (chú ý &). Nếu, sau khi chạy mã này, tôi sửa đổi $x - giả sử tôi đặt giá trị là 4 - nó cũng sẽ sửa đổi giá trị đầu tiên trong mảng. Vì vậy, khi bạn sử dụng mảng, $a[0] giờ sẽ chứa 4.

Xem this section hướng dẫn để biết thêm thông tin về cách hoạt động của tham chiếu trong PHP.


Tùy thuộc vào chủng loại và giá trị của các biến được sử dụng như các thành viên mảng, các hoạt động sao chép có thể không xảy ra tại thời điểm chuyển nhượng ngay cả khi bằng giá trị được giao. PHP nội bộ sử dụng copy-on-write trong nhiều tình huống nhất có thể vì lý do hiệu suất và hiệu quả bộ nhớ. Tuy nhiên, về mặt hành vi trong ngữ cảnh của mã của bạn, bạn có thể coi nó như là một bản sao đơn giản.

1

Có, sử dụng &

$a = array(&$b, &$c, &$d); 
15

mảng Gán bằng cách tham chiếu là có thể khi gán biến mảng để biến khác:

// By value... 
$a = array(1,2,3); 
$b = $a; 
array_push($a, 5); 
print_r($b); 

// $b is not a reference to $a 
Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
) 

// By Reference 
$a = array(1,2,3); 
$b = &$a; // Here we assign by reference 
array_push($a, 5); 
print_r($b); 

// $b is a reference to $a and gets the new value (3 => 5) 
Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 5 
) 
Các vấn đề liên quan