有什么方法可以设置 PHP 对象,以便当我尝试将它们转换为 JSON 时,它们所有受保护的属性都会显示出来?
我读过其他答案建议我添加一个toJson()
函数到对象,但这可能并不能真正帮助我很多。在大多数情况下,我有一个对象数组,并对数组本身执行编码。
$array = [
$object1, $object2, $object3, 5, 'string', $object4
];
return json_encode($array);
是的,我可以循环遍历这个数组并调用toJson()
在每个具有此类方法的元素上,但这似乎并不正确。有没有办法可以使用魔法方法来实现这一目标?
您可以实施JsonSerializable http://php.net/manual/en/class.jsonserializable.php接口在你的类中,这样你就可以完全控制它的序列化方式。您还可以创建一个Trait http://php.net/manual/en/language.oop5.traits.php防止复制粘贴序列化方法:
<?php
trait JsonSerializer {
public function jsonSerialize()
{
return get_object_vars($this);
}
}
class Foo implements \JsonSerializable
{
protected $foo = 'bar';
use JsonSerializer;
}
class Bar implements \JsonSerializable
{
protected $bar = 'baz';
use JsonSerializer;
}
$foo = new Foo;
$bar = new Bar;
var_dump(json_encode([$foo, $bar]));
或者你可以使用反射 http://php.net/manual/en/book.reflection.php做你想做的事:
<?php
class Foo
{
protected $foo = 'bar';
}
class Bar
{
protected $bar = 'baz';
}
$foo = new Foo;
$bar = new Bar;
class Seriailzer
{
public function serialize($toJson)
{
$data = [];
foreach ($toJson as $item) {
$data[] = $this->serializeItem($item);
}
return json_encode($data);
}
private function serializeItem($item)
{
if (!is_object($item)) {
return $item;
}
return $this->getProperties($item);
}
private function getProperties($obj)
{
$rc = new ReflectionClass($obj);
return $rc->getProperties();
}
}
$serializer = new Seriailzer();
var_dump($serializer->serialize([$foo, $bar]));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)