gpt4 book ai didi

PHP:__toString() 和 json_encode() 不能很好地协同工作

转载 作者:可可西里 更新时间:2023-10-31 22:19:11 25 4
gpt4 key购买 nike

我遇到了一个奇怪的问题,我不确定如何解决它。我有几个类都是 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;

输出结果是

[{},{}]

期望的输出是

[{"foo":"bar"},{"foo":"bar"}]

问题是我依赖 __toString() Hook 来为我完成工作。但它不能,因为 json_encode() 使用的序列化不会调用 __toString()。当它遇到嵌套对象时,它只简单地序列化公共(public)属性。

那么,问题就变成了:有没有一种方法可以开发 JSON 类的托管接口(interface),既让我可以对属性使用 setter 和 getter,又能让我获得我想要的 JSON 序列化行为?

如果不清楚,这里有一个不会工作的实现示例,因为 __set() Hook 仅在初始分配时调用

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;

但是我将不得不依靠其他开发人员的勤奋来使用 setter - 我无法通过编程强制遵守此解决方案。

---> 编辑<---

现在测试 Rob Elsner 的 react

<?php

class a implements IteratorAggregate
{
public $foo = 'bar';
protected $bar = 'baz';

public function getIterator()
{
echo __METHOD__;
}
}

echo json_encode( new a );

当您执行此操作时,您可以看到 getIterator() 方法从未被调用过。

最佳答案

迟到的答案,但可能对遇到同样问题的其他人有用。

PHP < 5.4.0 json_encode 中不调用对象的任何方法。这对 getIterator、__serialize 等有效...

然而,在 PHP > v5.4.0 中,引入了一个名为 JsonSerializable 的新接口(interface)。 .

json_encode 在对象上调用时,它基本上控制对象的行为。


示例:

class A implements JsonSerializable
{
protected $a = array();

public function __construct()
{
$this->a = array( new B, new B );
}

public function jsonSerialize()
{
return $this->a;
}
}

class B implements JsonSerializable
{
protected $b = array( 'foo' => 'bar' );

public function jsonSerialize()
{
return $this->b;
}
}


$foo = new A();

$json = json_encode($foo);

var_dump($json);

输出:

string(29) "[{"foo":"bar"},{"foo":"bar"}]"

关于PHP:__toString() 和 json_encode() 不能很好地协同工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/401908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com