我想将我的类对象转换为数组。我已经问过一个关于如何将对象转换为数组的问题。
但是在这样做时我想知道我们是否可以做这样的事情:
$ arrObj =(array)$ objectOfMyClass;
我知道它会将对象转换为数组但是如果有一些用户定义的函数,我可以在其中控制这种行为并允许少数成员作为数组键传递。
对于Exmaple,我想说我有一个班级:
class Property {
private $x;
protected $y;
public $z;
public function someFunction() {
//some code
}
public function someFunction1() {
//some code1
}
}
$objArray = (array) (new Property());
echo '<pre>', print_r($objArray, true), '</pre>';
输出:
Array
(
[Propertyx] =>
[*y] =>
[z] =>
)
但是我不想要这个输出我想要改变这个输出并希望输出像这样:
Array
(
[z] =>
)
或
Array
(
[y] =>
[z] =>
)
因此,当某人尝试type cast
我的类对象时,我必须通过某种方式调用用户定义的函数:
class Property {
....
....
public function __toArray() {
return <'only public or protected members'>
}
}
当某人使用以下陈述时:
$objArray = (array) (new Property());
它应该调用__toArray
方法。与__toString
相同。
如果有人知道如何做这样的事情,请帮助我。
如果有任何其他解决方案可能导致相同的输出将非常有帮助。
先谢谢。
答案 0 :(得分:2)
不幸的是,对于数组转换,没有相当于__toString
的魔法。多年来有一些建议要添加它,以及类似的__toBool
,__toFloat
方法,但它们都没有取得多大进展(例如https://wiki.php.net/rfc/object_cast_to_types)
对象支持实现ArrayAccess
接口,它以其他方式处理它们像数组一样,但它没有提供完整转换的方法。
有几种可用的解决方法:
如前所述,只能使用get_object_vars
方法转换公共属性,例如
class Foo
{
private $x = 1;
protected $y = 2;
public $z = 3;
}
print_r(get_object_vars(new Foo));
Array
(
[z] => 3
)
JsonSerializable接口允许您将自定义逻辑应用于调用json_encode
时发生的情况,这提供了一个改进,它允许您包含私有或受保护的属性,或者您拥有的任何其他自定义逻辑。
class Foo implements JsonSerializable
{
private $x = 1;
protected $y = 2;
public $z = 3;
public function jsonSerialize()
{
return get_object_vars($this);
}
}
print_r(json_decode(json_encode(new Foo), true));
Array
(
[x] => 1
[y] => 2
[z] => 3
)
上面的json_decode
和json_encode
调用当然可以包含在一些简单的语法糖中,例如
function toArray($obj)
{
return json_decode(json_encode($obj), true);
}
print_r(toArray(new Foo));
但是,这些都不允许您覆盖使用数组转换本身时发生的情况。希望有一天会有一个提案被接受,但在此之前这些是最好的选择。
答案 1 :(得分:1)
使用json_decode()
和json_encode()
将php对象转换为数组..
$obj = (object) array('1' => 'foo');
echo "<pre>"; print_r($obj);
您的$obj
看起来像这样:
stdClass Object
(
[1] => foo
)
现在使用:
$array = json_decode(json_encode($obj),true);
echo "<pre>"; print_r($array);
这将为您提供数组
Array
(
[1] => foo
)