2012-02-02 36 views
5

Nếu tôi chuyển một biến hoặc đối tượng cho một cuộc gọi hàm bằng tham chiếu, tôi sẽ tưởng tượng nó tránh tạo một đối tượng thứ hai trong bộ nhớ, do đó bảo tồn tài nguyên? Ví dụ:Có đi qua tham chiếu Tránh tạo biến mới không?

<?php 

class CoolObject 
{ 
    // Have some properties here 

    public function __construct() 
    { 
     // Do some stuff 
    } 

    public function test() 
    { 
     echo("Test"); 
    } 
} 

function doSomething(&$param) 
{ 
    // Calls original instance, still only one object in memory 
    $param->test(); 

    // Does this create a second instance in memory, or just assign 
    // the reference? 
    $newObj = $param; 
} 

// Create 1st instance of object in memory 
$myObj = new CoolObject; 

// Do a test to determine number of instances created 
doSomething($myObj); 

?> 

Khi tôi giao "bằng cách tham khảo" biến đến $ newObj, sao nó tạo một hình mới trong bộ nhớ đưa đếm đến hai, hoặc sao nó chỉ vượt qua các tài liệu tham khảo vẫn chỉ để lại một đối tượng ?

Trả lời

3

Nếu bạn chuyển một biến theo tham chiếu, bạn chính xác ở chỗ nó không trùng lặp đối tượng. Thay vào đó, nó sao chép con trỏ vào đối tượng. Vì vậy, trong khi nó sử dụng một số bộ nhớ, nó chỉ là số lượng bộ nhớ bằng với kích thước của một con trỏ.

Khi bạn tạo một biến khác trỏ đến cùng một đối tượng, một lần nữa, bạn đang sao chép con trỏ, với cùng các hậu quả như trên.

Theo như đếm và đối tượng tham chiếu, mỗi khi bạn sao chép con trỏ, bộ đếm tham chiếu sẽ được tăng lên.

Chỉ khi số tham chiếu bằng 0 thì đối tượng được giải phóng.

1

hiểu biết của tôi là nếu bạn vượt qua bằng cách tham khảo, bạn không tạo một biến mới, nhưng thay đổi thực hiện để biến bạn sử dụng chức năng đó cũng sẽ ảnh hưởng đến các biến ban đầu mà bạn đã nhập.

+0

Ok, tôi hiểu điều đó. Điều gì về phần thứ hai ... là $ newObj một trường hợp mới hoặc một "con trỏ" để $ myObj? –

0

Đối tượng luôn được chuyển qua tham chiếu. Chỉ các vars đơn giản thường được chuyển qua tham chiếu nếu bạn sử dụng dấu hiệu &. do đó $myObj là một "con trỏ"

+0

Câu đầu tiên đó là những gì tôi cần cho tìm kiếm của Google.Đây là những gì tôi đã học được http://php.net/manual/en/language.oop5.references.php –

2

Khái niệm chung về các tham chiếu và giá trị của đối tượng thường được hiểu rất ít. Một biến đối tượng chứa một xử lý cho các đối tượng, vì vậy nếu $x là một số đối tượng và chúng ta gán nó vào một vài biến khác, nói

$x = new Jim; 
$d = $x; 
$e &= $x; 

các 2dn và báo cáo thứ 3 là tập giá rẻ như tất cả những thực hiện là gán một đối tượng xử lý. Điều này có cùng thứ tự chi phí như $y=5, chẳng hạn.

$d->someproperty$d->somemethod() tham chiếu giống như $x->someproperty$x->somemethod(). Ditto cho $e. Sự khác biệt xảy ra khi bạn làm bài tập mới để $d$e:

$d = new Fred; 
$e = $someotherobject; 

$d nay đề cập đến một đối tượng khác nhau từ $x, nhưng $x là khác không thay đổi. Với việc gán $e$e vẫn đề cập đến cùng một đối tượng là $x nhưng cả hai giờ đều tham chiếu thành Fred. Điều này đã tạo ra một tác dụng phụ, cố ý hoặc (thường xuyên hơn) ngẫu nhiên. Làm điều này thông qua các đối số hàm cũng giống nhau.

đạo đức: Không sử dụng tài liệu tham khảo với các đối tượng, trừ khi bạn thực sự hiểu những gì bạn đang làm, và tại sao, và những gì những cạm bẫy đang có.

Các vấn đề liên quan