Я так понял:
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