Как я могу запустить __toString (), используя & quot; yield & quot ;. У тебя есть решение?

я использую __нанизывать() в классе в php. Как я могу бежать __нанизывать() с помощью «Уступать«. Есть ли решение?
Мой английский не очень хорош, извини. Смотрите пример.

<?php

class test
{
private $i;

public function find()
{
$this->i = array(
1,
2,
3
);
return $this;
}

public function data()
{
for ($this->i = 1; $this->i <= 3; $this->i++) {
yield $this->i;
}
}

public function __toString()
{
if (is_object($this->i) && ($this->i instanceof \Traversable)) {
return print_r(iterator_to_array($this->i), true);
}
return print_r($this->i, true);
}
}

Пример запуска:

$a = (new test())->find();

echo $a;

Resut:

Array
(
[0] => 1
[1] => 2
[2] => 3
)

Пример запуска:

$a = (new test())->data();

echo $a;

Результат:
Исправимая фатальная ошибка: объект класса Generator не может быть преобразован в строку

0

Решение

С помощью yield в функции возвращает Генератор, который не реализует __toString,

Вы можете убедиться в этом, сбросив значение:

$a = (new test())->data();
var_dump($a);

Вы можете потреблять генератор с iterator_to_array а затем распечатать результат, как, как вы сделали в своем классе __toString метод:

$a = (new test())->data();
print_r(iterator_to_array($a));

Мне трудно понять, чего ты пытаешься достичь. Если вы хотите вывести Генератор сгенерированные значения из __toString, то следующее может быть тем, что вы ищете:

public function __toString()
{
return print_r(iterator_to_array($this->data()), true);
}

И далее:

$a = new test();
echo $a;

Я хотел бы подчеркнуть, что data() метод возвращает Generator, а не экземпляр вашего test учебный класс. Таким образом, вы не можете просто повторить результат от data(),

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]