@avr1972

Как работает Generator::send в php?

Вот пример из справочника
<?php
function printer() {
    while (true) {
        $string = yield;
        echo $string."\n";
    }
}

$printer = printer();
$printer->send('Hello world!');
$printer->send('Bye world!');
?>

Я не могу понять смысла конструкции:
while (true) {
        $string = yield;
        echo $string."\n";
}

Переменной $string присваивается ключевое слово? Вроде yield похож на return? C таким же успехом можно написать $string= return? Помогите пожалуйста разобраться. Заранее большое спасибо
  • Вопрос задан
  • 536 просмотров
Решения вопроса 1
Inkognitoss
@Inkognitoss
Full-stack разработчик.
Я так понял:

Generator::send - передает значение в yield и возобновляет его работу.
Вообще yield сравнивают return, похоже, только потому что оно прерывает работу функции, а при следующем вызове (или как в примере передаче значения генератору) продолжает выполнение этой функции. Поэтому `$string= return` не прокатит. Я не знаю, можно ли return присвоить значение))))

На самом деле в примере
while (true) {
        $string = yield;
        echo $string."\n";
    }

while гарантирует, что такой метод будет исполняться бесконечно. Но вот yield прерывает процесс выполнения. И каждый раз, когда вы делаете ->send('hi, man'); метод продолжает выполняться, зацикливается и снова тормозит. Этот пример на деле наверное тавтология, но демонстрирует суть.

Давайте сделаем пример более (менее) полезным:
function printer() {
	$line = 1;
	
    while (true) {
        $string = yield;
        echo ($line++).$string.PHP_EOL;
    }
}

$printer = printer();
$printer->send('Hello world!');
$printer->send('Bye world!');

посмотреть:
https://3v4l.org/L0Pra
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы