我遇到了一个奇怪的问题,我不知道如何解决它。我有几个类,它们都是 JSON 对象的 PHP 实现。这是问题的说明
class A
{
protected $a;
public function __construct()
{
$this->a = array( new B, new B );
}
public function __toString()
{
return json_encode( $this->a );
}
}
class B
{
protected $b = array( 'foo' => 'bar' );
public function __toString()
{
return json_encode( $this->b );
}
}
$a = new A();
echo $a;
其输出是
[{},{}]
当。。。的时候desired输出是
[{"foo":"bar"},{"foo":"bar"}]
问题是我依赖 __toString() 钩子来为我完成工作。但它不能,因为 json_encode() 使用的序列化不会调用 __toString()。当它遇到嵌套对象时,它只是简单地序列化公共属性。
那么,问题就变成了这样:有没有一种方法可以开发 JSON 类的托管接口,既可以让我使用属性的 setter 和 getter,又可以让我获得我想要的 JSON 序列化行为?
如果还不清楚,这里有一个实现示例won't工作,因为 __set() 钩子仅在初始分配时被调用
class a
{
public function __set( $prop, $value )
{
echo __METHOD__, PHP_EOL;
$this->$prop = $value;
}
public function __toString()
{
return json_encode( $this );
}
}
$a = new a;
$a->foo = 'bar';
$a->foo = 'baz';
echo $a;
我想我也可以做这样的事情
class a
{
public $foo;
public function setFoo( $value )
{
$this->foo = $value;
}
public function __toString()
{
return json_encode( $this );
}
}
$a = new a;
$a->setFoo( 'bar' );
echo $a;
但随后我将不得不依靠其他开发人员的勤奋来使用设置器 - 我无法以编程方式强制遵守此解决方案。
---> 编辑
现在测试一下 Rob Elsner 的反应
<?php
class a implements IteratorAggregate
{
public $foo = 'bar';
protected $bar = 'baz';
public function getIterator()
{
echo __METHOD__;
}
}
echo json_encode( new a );
当您执行此操作时,您可以看到 getIterator() 方法从未被调用。