如何正确迭代 Mustache 中具有私有属性的对象数组?
How to iterate over array of objects with private properties in Mustache properly?
小胡子模板示例:
{{#entites}}
<a href="{{url}}">{{title}}</a>
{{/entities}}
渲染者:
$m = new Mustache_Engine(
['loader' => new Mustache_Loader_FilesystemLoader('../views')]
);
echo $m->render('index', $data);
基本嵌套数组。
$data = [
'entities' => [
[
'title' => 'title value',
'url' => 'url value',
]
]
];
这在模板中正确呈现。
class 的对象数组:
class Entity
{
private $title;
private $url;
//setter & getters
public function __get($name)
{
return $this->$name;
}
}
小胡子参数:
$data = [
'entities' => [
$instance1
]
];
在这种情况下不起作用 - 输出为空(没有来自属性的值)
为什么不用魔术方法,为什么不在 class
中使用这样的函数
public function toArray()
{
$vars = [];
foreach($this as $varName => $varValue) {
$vars[$varName] = $varValue;
}
return $vars;
}
然后调用该函数以获取变量作为数组
$data = [
'entities' => $instance1->toArray()
];
您可以使用 ArrayAccess
接口来访问您的私有属性,如下所示:
class Foo implements ArrayAccess {
private $x = 'hello';
public $y = 'world';
public function offsetExists ($offset) {}
public function offsetGet ($offset) {
return $this->$offset;
}
public function offsetSet ($offset, $value) {}
public function offsetUnset ($offset) {}
}
$a = new Foo;
print_r($a); // Print: hello
当然这是一个简单的例子,您需要为其余的继承方法添加更多的业务逻辑。
小胡子模板示例:
{{#entites}}
<a href="{{url}}">{{title}}</a>
{{/entities}}
渲染者:
$m = new Mustache_Engine(
['loader' => new Mustache_Loader_FilesystemLoader('../views')]
);
echo $m->render('index', $data);
基本嵌套数组。
$data = [
'entities' => [
[
'title' => 'title value',
'url' => 'url value',
]
]
];
这在模板中正确呈现。
class 的对象数组:
class Entity
{
private $title;
private $url;
//setter & getters
public function __get($name)
{
return $this->$name;
}
}
小胡子参数:
$data = [
'entities' => [
$instance1
]
];
在这种情况下不起作用 - 输出为空(没有来自属性的值)
为什么不用魔术方法,为什么不在 class
中使用这样的函数public function toArray()
{
$vars = [];
foreach($this as $varName => $varValue) {
$vars[$varName] = $varValue;
}
return $vars;
}
然后调用该函数以获取变量作为数组
$data = [
'entities' => $instance1->toArray()
];
您可以使用 ArrayAccess
接口来访问您的私有属性,如下所示:
class Foo implements ArrayAccess {
private $x = 'hello';
public $y = 'world';
public function offsetExists ($offset) {}
public function offsetGet ($offset) {
return $this->$offset;
}
public function offsetSet ($offset, $value) {}
public function offsetUnset ($offset) {}
}
$a = new Foo;
print_r($a); // Print: hello
当然这是一个简单的例子,您需要为其余的继承方法添加更多的业务逻辑。