这与 Twig 没有直接关系,而是 PHP 如何处理对象的迭代。
例如,如果你这样做会发生什么?
class MyObject
{
protected $foo;
public function __construct()
{
$this->foo = 'bar';
}
public function getFoo()
{
return $this->foo;
}
}
$myObject = new MyObject();
foreach ( $myObject as $property => $value )
{
echo "$property: $value<br>";
}
没有。齐尔奇。纳达。浏览器出现白屏。
但是,如果您将对象转换为数组,那么它可以工作
foreach ( (array) $myObject as $property => $value )
{
echo "$property: $value<br>";
}
// *foo: bar
那个星号是怎么回事?稍后会详细介绍...
但是,您不能在 Twig 中使用 PHP 的显式类型转换。所以现在怎么办?输入迭代器聚合
class MyObject implements \IteratorAggregate
{
protected $foo;
public function __construct()
{
$this->foo = 'bar';
}
public function getFoo()
{
return $this->foo;
}
public function getIterator()
{
return new \ArrayIterator( (array) $this );
}
}
但是,您仍然会遇到一个问题:该死的星号。它存在是因为MyObject::$foo
-protected
当类型从MyObject转换为array时,PHP 会自动执行此操作。所以现在怎么办?好吧,还有其他方法可以在对象上公开/创建迭代器。你总是可以“手动”做
public function getIterator()
{
return new \ArrayIterator( array(
'foo' => $this->getFoo()
) );
}
您也可以实现Iterator或者更深入兔子的洞并从ArrayObject继承