я использую __нанизывать() в классе в 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 не может быть преобразован в строку
С помощью 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()
,
Других решений пока нет …