Năng suất từ ​​​​trong php

Trình tạo cung cấp một cách dễ dàng để triển khai các trình vòng lặp đơn giản mà không cần chi phí hoặc độ phức tạp của việc triển khai một lớp triển khai giao diện Iterator

Trình tạo cho phép bạn viết mã sử dụng foreach để lặp lại một tập hợp dữ liệu mà không cần tạo mảng trong bộ nhớ, điều này có thể khiến bạn vượt quá giới hạn bộ nhớ hoặc yêu cầu một lượng thời gian xử lý đáng kể để tạo. Thay vào đó, bạn có thể viết một hàm tạo, giống như một hàm thông thường, ngoại trừ việc thay vì trả về một lần, một trình tạo có thể tạo ra nhiều lần nếu cần để cung cấp các giá trị được lặp lại

Một ví dụ đơn giản về điều này là triển khai lại hàm range() dưới dạng trình tạo. Hàm phạm vi () tiêu chuẩn phải tạo một mảng với mọi giá trị trong đó và trả về nó, điều này có thể dẫn đến các mảng lớn. ví dụ: phạm vi gọi (0, 1000000) sẽ dẫn đến hơn 100 MB bộ nhớ được sử dụng

Thay vào đó, chúng ta có thể triển khai trình tạo

function getValues() {
    yield 'value';
}
// print the string "value"
echo getValues();
0, chỉ cần đủ bộ nhớ để tạo đối tượng Iterator và theo dõi trạng thái hiện tại của trình tạo bên trong, hóa ra là dưới 1 kilobyte

Ví dụ #1 Triển khai phạm vi () làm trình tạo

function getValues() {
    yield 'value';
}
// print the string "value"
echo getValues();
1

function getValues() {
    yield 'value';
}
// print the string "value"
echo getValues();
2

function getValues() {
    yield 'value';
}
// print the string "value"
echo getValues();
3

function getValues() {
    yield 'value';
}
// print the string "value"
echo getValues();
4

function getValues() {
    yield 'value';
}
// print the string "value"
echo getValues();
5

function getValues() {
    yield 'value';
}
// print the string "value"
echo getValues();
6

Ví dụ trên sẽ xuất ra

Single digit odd numbers from range():  1 3 5 7 9 
Single digit odd numbers from xrange(): 1 3 5 7 9 

Khi một hàm tạo được gọi, một đối tượng mới của lớp Trình tạo bên trong được trả về. Đối tượng này triển khai giao diện Iterator theo cách giống như đối tượng iterator chỉ chuyển tiếp và cung cấp các phương thức có thể được gọi để thao tác trạng thái của trình tạo, bao gồm gửi giá trị đến và trả về giá trị từ nó

Từ khóa

function getValues() {
    yield 'value';
}
// print the string "value"
echo getValues();
7 được sử dụng để tạo hàm tạo. Các hàm tạo hoạt động như các trình vòng lặp có thể được lặp lại bằng vòng lặp
function getValues() {
    yield 'value';
}
// print the string "value"
echo getValues();
8

Từ khóa

function getValues() {
    yield 'value';
}
// print the string "value"
echo getValues();
7 cung cấp từng giá trị từ một trình lặp mỗi khi hàm tạo được gọi cho đến khi không còn mục nào trong trình lặp, sau đó trình tạo sẽ chuyển sang từ khóa
function getValues() {
    return 'value';
}
var_dump(getValues()); // string(5) "value" đây là 1 string được trả về kiểu chuổi.

function getValues() {
    yield 'value';
}
var_dump(getValues()); // class Generator#1 (0) {} đây là 1 Object Generator được trả về từ 1 Class Generator.
0 tiếp theo

Năng suất là gì?

Yield is a function Generator giống như một hàm bình thường, ngoại trừ việc thay vì trả về một giá trị, Generator sẽ mang lại nhiều giá trị như nó cần. Nhìn vào ví dụ sau để dễ hiểu nhé

Nội dung chính Hiển thị

  • Năng suất là gì?
  • Khác nhau giữa yield và return
  • option of Yield is what ?
  • Kết luận
  • Tài liệu tham khảo

function getValues() {
    yield 'value';
}
// print the string "value"
echo getValues();

Tất nhiên, đây không phải là cách nó hoạt động, ví dụ trước sẽ cho bạn một lỗi nghiêm trọng. Unable to convert objects of the layer Trình tạo thành chuỗi, chúng ta hãy làm rõ hơn bên dưới đây

Năng suất từ ​​​​trong php

Khác nhau giữa yield và return

Lỗi trước có nghĩa là hàm getValues() không trả về một chuỗi như mong đợi, chúng ta hãy kiểm tra kiểu của nó

function getValues() {
    return 'value';
}
var_dump(getValues()); // string(5) "value" đây là 1 string được trả về kiểu chuổi.

function getValues() {
    yield 'value';
}
var_dump(getValues()); // class Generator#1 (0) {} đây là 1 Object Generator được trả về từ 1 Class Generator.

Lớp Generator triển khai giao diện Iterator, có nghĩa là bạn phải lặp qua hàm getValue () để có được các giá trị

foreach (getValues() as $value) {
   echo $value;
}
// using variable is also alright
$values = getValues();
foreach ($values as $value) {
   echo $value;
}

Nhưng đây không phải là sự khác biệt duy nhất

Trình tạo cho phép bạn viết mã sử dụng foreach để lặp lại một tập hợp dữ liệu mà không cần xây dựng một mảng trong bộ nhớ, điều này có thể khiến bạn vượt quá giới hạn bộ nhớ. Quá tốt nếu bạn đang cần sử dụng loop lồng nhau rồi

Trong ví dụ sau, chúng tôi sẽ xây dựng một mảng bao gồm 800. 000 phần tử và trả về nó từ hàm getValues() , và trong khi đó, chúng ta sẽ lấy bộ nhớ được phân bổ cho tập lệnh này bằng cách sử dụng hàm memory_get_usage() , chúng ta sẽ sử dụng bộ nhớ sau mỗi 200. 000 phần tử được thêm vào, có nghĩa là chúng ta sẽ đặt bốn điểm kiểm tra

Điều xảy ra trong ví dụ trước là việc tiêu thụ bộ nhớ và đầu ra của lệnh này không

0.34 MB
8.35 MB
16.35 MB
32.35 MB

Điều đó có nghĩa là tập lệnh vài dòng của chúng tôi đã tiêu thụ hơn 30 Megabyte bộ nhớ (Ôi trời ơi), mỗi khi bạn thêm một phần tử vào mảng $valueArray, bạn sẽ tăng kích thước của nó trong bộ nhớ. Chương trình càng lặp nhiều thì càng dễ crash nhé. Giờ hãy cùng LPTech thử với Yield xem thế nào

Đầu ra của kịch bản này đáng ngạc nhiên đến cả LPTech cũng giật mình

0.34 MB
0.34 MB
0.34 MB
0.34 MB

Điều đó không có nghĩa là bạn chuyển từ biểu thức trả về thành năng suất, nhưng nếu bạn đang xây dựng các mảng lớn trong ứng dụng của mình, điều này gây ra các vấn đề về bộ nhớ trên máy chủ, thì năng suất sẽ phù hợp với

option of Yield is what ?

Có nhiều lựa chọn cho năng suất, tôi sẽ làm nổi bật một vài trong số chúng

Sử dụng năng suất, bạn cũng có thể sử dụng trở lại;

________số 8

Trả về khóa-giá trị

function getValues() {
   yield 'key' => 'value';
}
$values = getValues();
foreach ($values as $key => $value) {
   echo $key . ' => ' . $value;
}

Kết luận

Lý do chính của chủ đề này của LPTech là để làm rõ sự khác biệt giữa năng suất và trả lại đặc biệt về bộ nhớ, hiển thị một số ví dụ vì tôi thấy nó thực sự quan trọng đối với bất kỳ lập trình viên nào đang đi. .