2015-12-29 21 views
5

Câu hỏi đơn giản.Máy phát điện PHP - Bộ sưu tập rác

Khi nào hoặc bằng cách nào, bằng PHP hoặc chính bạn làm máy phát điện phá hủy ngăn xếp của chúng?

Lấy ví dụ sau đây:

function doWork(): Generator 
{ 
    // create some objects. 
    $o1 = new stdClass(); 
    $o2 = new stdClass(); 

    // pause here and wait for data. 
    $value = yield 1; 

    // By referencing the above objects, they shouldn't destruct. 
    $o1->property = $value; 
    $o2->property = $value; 

    yield $o1; 
    yield $o2; 

    // End of stack. 
} 

// Create the generator. 
$generator = doWork(); 

$value = $generator->current(); // $value will equal 1. 

if ($x) { 
    $generator->send('Hello, World!'); // Continue execution of the generator. 
    $o1 = $generator->current(); 
    $generator->next(); 
    $o2 = $generator->current(); 
    $generator->next(); // Complete the generator 

    var_dump($o1); 
    var_dump($o2); 
} else { 
    // Do nothing with the generator. 
} 

// Carry on with script ... 

Trong ví dụ này một máy phát điện được bắt đầu và hai đối tượng được tạo ra. Tại thời điểm này nó được mang lại, và dữ liệu thêm được yêu cầu.

Đã đạt được tuyên bố IF.

Trường hợp 1

Nếu $x là đúng, giá trị "Hello, World!" sẽ được gửi đến các máy phát điện và các đối tượng sẽ được áp dụng với những đặc tính mới của họ.

Lần sau khi dữ liệu được cung cấp được đọc, các đối tượng sẽ được trả về.

Trường hợp 2

Nếu $x là sai, các máy phát điện sẽ không còn được sử dụng.

Câu hỏi

Trong trường hợp 1, tôi mong chờ chồng để đóng giống như bất kỳ chức năng khác, nhưng những gì xảy ra đối với các máy phát điện trong trường hợp 2? Liệu nó và tất cả các tham chiếu đối tượng còn lại vẫn còn trong bộ nhớ cho đến khi kịch bản kết thúc?

Hoặc mất tham chiếu đến $generator làm điều đó và tất cả các tham chiếu bên trong sẽ bị xóa?

Trả lời

2

Có hai điều kiện mà một máy phát điện phá hủy bối cảnh thực hiện của nó (mà cũng bao gồm các bảng biến):

  1. Nếu máy phát kết thúc thực hiện. Điều này có thể xảy ra bằng cách thực hiện một số return (bao gồm cả sự trở lại tiềm ẩn ở cuối hàm) hoặc thông qua một ngoại lệ chưa được thực hiện trong khi thực thi trình tạo.
  2. Nếu tất cả các tham chiếu đến đối tượng máy phát điện bị từ bỏ.

Vì vậy, không, trình tạo sẽ không hoạt động cho đến khi tập lệnh kết thúc. Nó sẽ bị hủy khi biến số $generator vượt quá phạm vi, tại thời điểm đó, trình tạo sẽ từ bỏ các tham chiếu của nó tới các giá trị biến và trạng thái thực thi khác.

Bạn có thể dễ dàng quan sát trật tự hủy diệt bằng cách tạo lớp học echo s trong trình hủy và sau đó khởi tạo lớp này thành biến cục bộ.

+0

Không có vấn đề gì, hãy cổ vũ bạn đời – Flosculus