Hướng dẫn php yield用法 - sử dụng năng suất php

Phía trước

Bài viết này là để thảo luận với bạn về việc sử dụng năng suất PHP trong trình tạo, không có vòng lặp _________ 19, __________ 20, _______21. Chỉ cần thảo luận về

current return : 12
2 để biến một hàm thành cách sử dụng của trình tạo.

Về các đặc điểm của

current return : 12
2, nó đã được đưa vào chương trình nghị sự khi phát triển
current return : 12
4.

Về việc sử dụng

current return : 12
2, tôi đã thấy hầu hết các bài viết ở lại. Cách sử dụng
current return : 12
2 Cách đeo dữ liệu trong

function yield_func()
{
    yield 12;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
echo 'current return : ' . $re;
9. Hôm nay tôi muốn nói với bạn tất cả các ngữ pháp của trình tạo.

Giải thích trang web chính thức

Trình tạo cho phép bạn ghi mã trong khối mã


function yield_func()
{
    yield 12;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
echo 'current return : ' . $re;
9 để lặp lại một tập hợp dữ liệu thay vì tạo một mảng trong bộ nhớ, điều này sẽ làm cho bộ nhớ của bạn giới hạn hoặc chiếm thời gian xử lý. Ngược lại, bạn có thể viết một hàm trình tạo, giống như một hàm tùy chỉnh thông thường. Nó khác với hàm thông thường chỉ một lần. Trình tạo có thể _
current return : 12
2 lần theo yêu cầu để tạo giá trị của phép lặp.

Sau khi đọc trang web chính thức của trang web chính thức, anh ấy đã giải thích với anh ấy: php.net tạo ra ngữ pháp. Mỗi từ nhận ra nó, nhưng dường như nó nhận ra ý nghĩa của nó. Chúng tôi chủ yếu xem xét hai phần của trang web chính thức:

  1. current return : 12
    2 Cú pháp.

  2. Mã ví dụ.

Trước tiên hãy nói về ngữ pháp. Ở bên trái năng suất là một tuyên bố gán và phía bên phải có thể là giá trị (nhưng cũng là biểu thức). Năng suất sẽ thực thi biểu thức ở bên phải trước và gửi giá trị $ bên ngoài trình tạo. Khi trình tạo nhận giá trị, câu bên trái sẽ được thực thi, được gán cho $ dữ liệu.


function func()
{
    $data = (yield [$express]);
}

Ngữ pháp là như thế này. Người ta ước tính rằng mọi người vẫn hơi xấu hổ. Chúng ta hãy xem ví dụ mã bên dưới trang web chính thức. Tôi nghĩ rằng ví dụ bên trong không đồng đều.

Lưu ý rằng các dấu ngoặc của bánh mì ngoài năng suất bên ngoài, nếu ở Php5.5, mức độ ưu tiên của $ Express ở phía bên phải là phán đoán, có thể thấp hơn câu gán của dữ liệu $ ở bên trái. Do đó, sử dụng năng suất trên PHP5, phía bên phải của năng suất là biểu thức chạy và phía bên trái cần được trả lại và gán, vì vậy dấu ngoặc đơn này là cần thiết. Sẽ không có vấn đề như vậy trong PHP7.

Hiểu nó bằng ví dụ

Cho dù đó là học ngôn ngữ con người, ngôn ngữ máy tính, đó là khởi đầu của việc bắt chước

Khi nó không rõ ràng về ngôn ngữ của con người, vì vậy hãy cho bạn biết những gì nó có thể làm và những gì bạn không thể làm thông qua một ví dụ.

Mã liên quan, tôi đặt nó vào gitee. Tôi hy vọng bạn có thể sao chép nó theo hoạt động cục bộ của bạn và tự mình chạy nó, giúp hiểu nội dung tiếp theo.

Git Clone gitee.com/xupaul/php-tenerator-yie ...

Cách tạo trình tạo

Trước tiên, hãy xác định một hàm, viết từ khóa năng suất trong hàm và gán hàm này cho một biến. Một máy phát được tạo ra.

CODE /PHP-SILL-TEST/YIELDFENSTS.PHP là một trình tạo được xác định nhiều trình tạo theo các kết hợp cú pháp khác nhau.

Mã thử /-php-m-tast /whatisgenrator.php, được sử dụng để kiểm tra các chức năng nào có thể tạo thành các trình tạo và không thể. Kết quả đang chạy như sau

Hướng dẫn php yield用法 - sử dụng năng suất php

  1. Phải có từ khóa _
    current return : 12
    2 trong hàm và hàm có thể là toàn bộ hàm kịch hoặc phương thức lớp.
  2. Ngay cả khi
    current return : 12
    2 chắc chắn sẽ không được thực thi và trình tạo sẽ được tạo. Xem: Năng suất_FUNC4
  3. Các từ khóa trần
    current return : 12
    2 là đủ (không gửi đi, không có đầu vào bên ngoài). Xem: Năng suất_FUNC2
  4. Việc sử dụng một máy phát trong hàm không biến mình thành một trình tạo. Xem: whield_func5
  5. Chạy trực tiếp trong chức năng EVAC
    current return : 12
    2 sẽ báo cáo lỗi. Xem: whield_func11

Vâng, có bất kỳ sự quan tâm nào, trong khi và cho tuyên bố trong hàm. Điều quan trọng là loại phán đoán của năng suất.

Chức năng của máy phát điện

Đối tượng máy phát được trả về từ máy phát điện.

Đối tượng máy phát không thể được khởi tạo thông qua mới.

  • Trình tạo :: Hiện tại - Quay trở lại giá trị hiện tại được tạo
  • Trình tạo :: Key -return vào khóa hiện được tạo
  • Trình tạo :: Tiếp theo -Cherator tiếp tục thực hiện
  • Máy phát điện :: Tua lại -Reset iterator
  • Trình tạo :: Gửi - Chuyển giá trị trong Trình tạo
  • Máy phát điện :: ném -throw một ngoại lệ trong máy phát điện
  • Trình tạo :: hợp lệ -Kiểm tra xem người lặp có đóng không
  • Trình tạo :: __ Wakeup -Serialized Gọi lại
  • Trình tạo :: getReturn -get giá trị trả về của máy phát điện

Trích từ Php.net Generalor

Nhìn vào các phương pháp trên, tôi không nghĩ về _


function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);
7, chúng thực sự giống nhau. Đồng thời, lưu ý rằng tài liệu của trang web chính thức không có phương pháp lập chỉ mục

function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);
8 và truy cập cũng là 404. Tài liệu dựa trên phiên bản EN và CH được sử dụng để tham khảo.

Trên đây là phương pháp của trình tạo, chúng tôi xem từng cái một.

Phương thức thử nghiệm /phphp-yield-test /generatormothod.php, có một ví dụ về từng phương thức, kết quả hoạt động như sau.

Hướng dẫn php yield用法 - sử dụng năng suất php

Hướng dẫn php yield用法 - sử dụng năng suất php

Hãy giải thích từng cái một.

Generator::current

  • Quay trở lại giá trị hiện tại

function yield_func()
{
    yield 12;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
echo 'current return : ' . $re;

Đầu ra:

current return : 12

Xem mã


function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);
9.

Thông qua trường hợp mã đầu tiên, bạn có thể nhận được một trình tạo gọi phương thức hiện tại để thực sự bắt đầu thực thi. Thực hiện cho đến khi năng suất. Nếu bạn không thể nhấn năng suất, thực thi đến cuối hàm.

Non -geneoator sẽ ngay lập tức thực thi và nhận kết quả, không phải là đối tượng đối tượng.

Thông qua các ví dụ 2, hãy gọi hiện tại một lần, hai lần, bạn có thể thấy nhật ký thực thi mã, lần thứ hai, chỉ trả lại kết quả của lần cuối cùng cho chúng tôi, không cho phép trình tạo thực thi lại.

Thông qua các ví dụ 1, gọi hàm sẽ nhận được giá trị trả về và nội dung của lợi nhuận là nội dung của phía bên trái của biểu thức năng suất. Nếu không có nội dung của biểu thức, nó là null.

Generator::send

  • Một giá trị được chuyển vào trình tạo
    current return : 12
    2 và trả về giá trị _
    get yield data: 32
    1 tiếp theo.

function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);

Đầu ra:

get yield data: 32

Xem mã


function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);
9.

Thông qua trường hợp mã đầu tiên, bạn có thể nhận được một trình tạo gọi phương thức hiện tại để thực sự bắt đầu thực thi. Thực hiện cho đến khi năng suất. Nếu bạn không thể nhấn năng suất, thực thi đến cuối hàm.

Non -geneoator sẽ ngay lập tức thực thi và nhận kết quả, không phải là đối tượng đối tượng.

Thông qua các ví dụ 2, hãy gọi hiện tại một lần, hai lần, bạn có thể thấy nhật ký thực thi mã, lần thứ hai, chỉ trả lại kết quả của lần cuối cùng cho chúng tôi, không cho phép trình tạo thực thi lại.

Generator::next

  • Thông qua các ví dụ 1, gọi hàm sẽ nhận được giá trị trả về và nội dung của lợi nhuận là nội dung của phía bên trái của biểu thức năng suất. Nếu không có nội dung của biểu thức, nó là null.

function yield_func()
{
    echo 'run to code line: ' . __LINE__ . PHP_EOL;
    yield;
    echo 'run to code line: ' . __LINE__ . PHP_EOL;
    return $result;
}

$gen = yield_func();
$gen->current();
echo 'current called' . PHP_EOL;
$gen->next();

Đầu ra:

run to code line: 4
current called
run to code line: 6

Xem mã


function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);
9.

Thông qua trường hợp mã đầu tiên, bạn có thể nhận được một trình tạo gọi phương thức hiện tại để thực sự bắt đầu thực thi. Thực hiện cho đến khi năng suất. Nếu bạn không thể nhấn năng suất, thực thi đến cuối hàm.

Generator::rewind

  • Non -geneoator sẽ ngay lập tức thực thi và nhận kết quả, không phải là đối tượng đối tượng.

function yield_func()
{
    echo 'run to code line: ' . __LINE__ . PHP_EOL;
    $result = yield 12;
    echo 'run to code line: ' . __LINE__ . PHP_EOL;
}

$gen = yield_func();
echo 'call yield_func rewind ' . PHP_EOL;
$gen->rewind();

Đầu ra:

call yield_func rewind 
run to code line: 4

Xem mã


function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);
9.

Thông qua trường hợp mã đầu tiên, bạn có thể nhận được một trình tạo gọi phương thức hiện tại để thực sự bắt đầu thực thi. Thực hiện cho đến khi năng suất. Nếu bạn không thể nhấn năng suất, thực thi đến cuối hàm.

Generator::throw

  • Non -geneoator sẽ ngay lập tức thực thi và nhận kết quả, không phải là đối tượng đối tượng.

function yield_func()
{
    try {
        $re = yield 'exception';
    } catch (Exception $e) {
        echo 'catched exception msg: ' .$e->getMessage();
    }
}

$gen = yield_func();
$gen->throw(new \Exception('new yield  exception'));

Đầu ra:


function yield_func()
{
    yield 12;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
echo 'current return : ' . $re;
0

Xem mã


function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);
9.

Thông qua trường hợp mã đầu tiên, bạn có thể nhận được một trình tạo gọi phương thức hiện tại để thực sự bắt đầu thực thi. Thực hiện cho đến khi năng suất. Nếu bạn không thể nhấn năng suất, thực thi đến cuối hàm.

Non -geneoator sẽ ngay lập tức thực thi và nhận kết quả, không phải là đối tượng đối tượng.

Generator::valid

  • Thông qua các ví dụ 2, hãy gọi hiện tại một lần, hai lần, bạn có thể thấy nhật ký thực thi mã, lần thứ hai, chỉ trả lại kết quả của lần cuối cùng cho chúng tôi, không cho phép trình tạo thực thi lại.

function yield_func()
{
    yield 12;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
echo 'current return : ' . $re;
1

Đầu ra:


function yield_func()
{
    yield 12;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
echo 'current return : ' . $re;
2

Xem mã


function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);
9.

Thông qua trường hợp mã đầu tiên, bạn có thể nhận được một trình tạo gọi phương thức hiện tại để thực sự bắt đầu thực thi. Thực hiện cho đến khi năng suất. Nếu bạn không thể nhấn năng suất, thực thi đến cuối hàm.

Non -geneoator sẽ ngay lập tức thực thi và nhận kết quả, không phải là đối tượng đối tượng.

Generator::key

  • Thông qua các ví dụ 2, hãy gọi hiện tại một lần, hai lần, bạn có thể thấy nhật ký thực thi mã, lần thứ hai, chỉ trả lại kết quả của lần cuối cùng cho chúng tôi, không cho phép trình tạo thực thi lại.

function yield_func()
{
    yield 12;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
echo 'current return : ' . $re;
3

Đầu ra:


function yield_func()
{
    yield 12;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
echo 'current return : ' . $re;
4

Xem mã


function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);
9.

Thông qua trường hợp mã đầu tiên, bạn có thể nhận được một trình tạo gọi phương thức hiện tại để thực sự bắt đầu thực thi. Thực hiện cho đến khi năng suất. Nếu bạn không thể nhấn năng suất, thực thi đến cuối hàm.

Non -geneoator sẽ ngay lập tức thực thi và nhận kết quả, không phải là đối tượng đối tượng.

Generator::__wakeup

  • Trình tạo :: __ Wakeup -Serialized Gọi lại

function yield_func()
{
    yield 12;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
echo 'current return : ' . $re;
5

Đầu ra:

Xem mã

function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);
9.

Thông qua trường hợp mã đầu tiên, bạn có thể nhận được một trình tạo gọi phương thức hiện tại để thực sự bắt đầu thực thi. Thực hiện cho đến khi năng suất. Nếu bạn không thể nhấn năng suất, thực thi đến cuối hàm.

Non -geneoator sẽ ngay lập tức thực thi và nhận kết quả, không phải là đối tượng đối tượng.

Generator::getReturn


function yield_func()
{
    yield 12;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
echo 'current return : ' . $re;
7

Đầu ra:


function yield_func()
{
    yield 12;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
echo 'current return : ' . $re;
8

Xem mã


function yield_func()
{
    $data = yield 12;
    echo 'get yield data: ' . $data;
    return 'a';
}

$gen = yield_func();
$re = $gen->current();
$gen->send(32);
9.

Thông qua trường hợp mã đầu tiên, bạn có thể nhận được một trình tạo gọi phương thức hiện tại để thực sự bắt đầu thực thi. Thực hiện cho đến khi năng suất. Nếu bạn không thể nhấn năng suất, thực thi đến cuối hàm.

Non -geneoator sẽ ngay lập tức thực thi và nhận kết quả, không phải là đối tượng đối tượng.

Thông qua các ví dụ 2, hãy gọi hiện tại một lần, hai lần, bạn có thể thấy nhật ký thực thi mã, lần thứ hai, chỉ trả lại kết quả của lần cuối cùng cho chúng tôi, không cho phép trình tạo thực thi lại.

Thông qua các ví dụ 1, gọi hàm sẽ nhận được giá trị trả về và nội dung của lợi nhuận là nội dung của phía bên trái của biểu thức năng suất. Nếu không có nội dung của biểu thức, nó là null.

Một giá trị được chuyển vào trình tạo current return : 122 và trả về giá trị _get yield data: 321 tiếp theo.

Ví dụ 3 là một cuộc gọi thông thường của dòng điện, gửi. Gọi mã hiện tại và chạy năng suất cho đến khi người dùng gửi tham số đầu vào. Sau khi nhận được đầu vào, tiếp tục chạy. Hiện tại có thể nhận được giá trị pop -up của năng suất và giá trị trả về gửi trống.

Hướng dẫn php yield用法 - sử dụng năng suất php

PHP yield 生命周期图

Ví dụ 4, gửi trực tiếp gửi, tương đương với việc gọi dòng điện, gửi. Tuy nhiên, giá trị trả lại của dòng điện sẽ không chuyển cho người dùng thông qua SEND.

Trong ví dụ 21, bạn có thể thấy rằng bạn có thể gọi trực tiếp Send (1), chạy trình tạo và nhập 1 đến năng suất đầu tiên và tiếp tục chạy đến giá trị trả về của sản lượng tiếp theo get yield data: 322. Do đó, ________ 43 và _get yield data: 324 là cùng một giá trị.

Nói cách khác: Bỏ qua dòng điện và gọi trực tiếp, nó sẽ mất giá trị pop -up năng suất đầu tiên.

Bỏ qua sự gián đoạn và để trình tạo tiếp tục thực hiện

Hướng dẫn php yield用法 - sử dụng năng suất php

Ví dụ 5, đây là một cuộc gọi thông thường hơn, mã
get yield data: 32
1 đang chạy
current return : 12
2, v.v.