2012-05-04 24 views
11

tôi đã xem lại hướng dẫn sử dụng php về ob_start() ob_end_clean() ob_end_flush(). Và tôi đã thấy một ví dụ khác về chủ đề, dù sao tôi đã sửa đổi ví dụ nhưng tôi đang bối rối vào thời điểm này. đây là kịch bản.điều gì đã xảy ra khi tôi sử dụng nhiều ob_start() mà không ob_end_clean() hoặc ob_end_flush()?

ob_start(); 
echo "Hello x, "; 

ob_start(); 
echo "Hello y, "; 

ob_start(); 
echo "Hello z, "; 

ob_start(); 
echo "Hello World"; 
$ob_2 = ob_get_contents(); 
ob_end_clean(); 

echo "Galaxy"; 
$ob_1 = ob_get_contents(); 
ob_end_clean(); 

echo " this is OB_1 : ".$ob_1; 
echo "<br> and this is OB_2 : ".$ob_2; 

Và đầu ra của kịch bản này là:

Xin chào x, Hello y, đây là OB_1: Xin chào z, Galaxy

và đây là OB_2: Hello World

--------------------------------------------

Tại sao đầu ra không giống như vậy?

đây là OB_1: Xin chào x, Hello y, Hello z, Galaxy

và đây là OB_2: Hello World

Và những gì là điểm tôi đã bỏ lỡ?

Trả lời

17

Bộ đệm đầu ra hoạt động như một chồng. Bạn tạo một bộ đệm và echo "Hello x," vào nó, sau đó bạn tạo một bộ đệm khác và echo "Hello y" vào nó, sau đó bạn tạo một bộ đệm thứ ba và echo "Hello z," vào nó. "Hello World" đi vào bộ đệm thứ tư, được đóng bởi cuộc gọi đến ob_end_clean(), vì vậy bạn quay lại chế độ thứ ba. Khi bạn gọi ob_get_contents() sau khi lặp lại "Galaxy", bạn sẽ nhận được nội dung của bộ đệm thứ ba đó.

Nếu bạn gọi lại ob_get_contents() ở cuối mã này, bạn sẽ nhận được "Xin chào y", đó là trong bộ đệm thứ hai. Và nếu bạn ob_end_close() và sau đó ob_get_contents() một lần nữa, bạn sẽ nhận được "Hello x" từ bộ đệm đầu tiên.

+2

Tôi đang cố gắng sử dụng flush(), ob_flush() vv trong một giờ, cố gắng tìm nguồn hữu ích. Bạn là người đầu tiên * giải thích * những gì đang diễn ra. 1 cho một câu trả lời đơn giản nhưng siêu hữu ích. –

32

Tôi sẽ chú thích mã của bạn để giải thích những gì đang diễn ra. Tất cả bộ đệm đầu ra được khởi tạo để trống, đó là tiêu chuẩn:

ob_start(); // open output buffer 1 
echo "Hello x, "; // echo appended to output buffer 1 

ob_start(); // open output buffer 2 
echo "Hello y, "; // echo appended output buffer 2 

ob_start(); // open output buffer 3 
echo "Hello z, "; // echo appended to output buffer 3 

ob_start(); // open output buffer 4 
echo "Hello World"; // echo appended output buffer 4 
$ob_2 = ob_get_contents(); // get contents of output buffer 4 
ob_end_clean(); // close and throw away contents of output buffer 4 

echo "Galaxy"; // echo appended to output buffer 3 
$ob_1 = ob_get_contents(); // get contents of output buffer 3 
ob_end_clean(); // close and throw away contents of output buffer 3 

// at this point, $ob_2 = "Hello World" and $ob_1 = "Hello z, Galaxy" 
// output buffer 1 = "Hello x," and output buffer 2 = "Hello y," 

echo " this is OB_1 : ".$ob_1; // echo appended to output buffer 2 

// output buffer 2 now looks like "Hello y, this is OB_1 : Hello z, Galaxy" 

echo "<br> and this is OB_2 : ".$ob_2; // echo appended to output buffer 2 

// output buffer 2 now looks like: 
// "Hello y, this is OB_1 : Hello z, Galaxy<br> and this is OB_2 : Hello World" 

// output buffer 2 implicitly flushed by end of script 
// output from buffer 2 captured by (appended to) output buffer 1 
// output buffer 1 now looks like: 
// "Hello x, Hello y, this is OB_1 : Hello z, Galaxy<br> and this is OB_2 : Hello World" 
// output buffer 1 implicitly closed by end of script. This is when your output 
// actually gets printed for this particular script. 
+1

cảm ơn, rất rõ ràng :) –

+1

xin lỗi, thực sự tôi đã quên –

+1

đây là giải thích tuyệt vời hehe. : D – gumuruh

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