当前位置:首页 > PHP

yield 实现php

2026-03-13 00:23:04PHP

yield 在 PHP 中的实现

yield 是 PHP 5.5 引入的关键字,用于生成器(Generator)的实现。生成器提供了一种更简单的方式来创建迭代器,无需实现完整的 Iterator 接口。

生成器的基本语法

使用 yield 关键字可以定义一个生成器函数。生成器函数在调用时不会立即执行,而是返回一个 Generator 对象。每次调用 Generator 对象的 current() 或 next() 方法时,函数会执行到下一个 yield 语句处暂停。

function generatorFunction() {
    yield 'value1';
    yield 'value2';
    yield 'value3';
}

$generator = generatorFunction();
foreach ($generator as $value) {
    echo $value . "\n";
}

yield 的高级用法

yield 不仅可以返回值,还可以接收值。通过 Generator::send() 方法可以向生成器发送值,这个值会成为 yield 表达式的返回值。

function echoingGenerator() {
    while (true) {
        $value = yield;
        echo $value . "\n";
    }
}

$generator = echoingGenerator();
$generator->send('Hello');
$generator->send('World');

yield from 语法

PHP 7.0 引入了 yield from 语法,允许一个生成器委托给另一个生成器、迭代器或数组。

function generator1() {
    yield 1;
    yield 2;
}

function generator2() {
    yield from generator1();
    yield 3;
}

foreach (generator2() as $value) {
    echo $value . "\n";
}

生成器的内存优势

生成器的主要优势在于内存效率。传统方法可能需要将整个数据集加载到内存中,而生成器可以一次只生成一个值,大大减少内存消耗。

function rangeGenerator($start, $end) {
    for ($i = $start; $i <= $end; $i++) {
        yield $i;
    }
}

// 这会非常高效,即使范围很大
foreach (rangeGenerator(1, 1000000) as $number) {
    // 处理每个数字
}

生成器与协程

生成器还可以用于实现简单的协程(coroutine),通过在生成器函数内部使用 yield 来暂停和恢复执行。

function task1() {
    for ($i = 1; $i <= 3; $i++) {
        echo "Task 1: $i\n";
        yield;
    }
}

function task2() {
    for ($i = 1; $i <= 3; $i++) {
        echo "Task 2: $i\n";
        yield;
    }
}

$t1 = task1();
$t2 = task2();

while ($t1->valid() || $t2->valid()) {
    $t1->next();
    $t2->next();
}

生成器的实际应用

生成器特别适合处理大型数据集、流式处理和实现简单的状态机。例如处理大型文件时,可以逐行读取而不需要将整个文件加载到内存中。

yield 实现php

function readLargeFile($fileName) {
    $file = fopen($fileName, 'r');

    while (!feof($file)) {
        yield fgets($file);
    }

    fclose($file);
}

foreach (readLargeFile('large_file.txt') as $line) {
    // 处理每一行
}

注意事项

生成器只能向前迭代,一旦迭代完成就不能重新开始。生成器函数执行完毕后,不能再从中获取值。生成器对象实现了 Iterator 接口,因此可以使用 foreach 循环遍历。

标签: yieldphp
分享给朋友:

相关文章

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php搜索功能实现的

php搜索功能实现的

PHP 搜索功能实现方法 数据库搜索实现 使用 SQL 的 LIKE 语句进行模糊匹配,适用于小型网站和简单搜索需求。 $searchTerm = $_GET['search']; $query =…

php 线程实现

php 线程实现

PHP 线程实现方法 PHP 本身是单线程语言,但可以通过扩展或库实现多线程功能。以下是几种常见的实现方式: 使用 pthreads 扩展 pthreads 是一个 PHP 扩展,允许在 PHP 中…