我想将我的类对象转换为数组。我已经问过一个关于如何将对象转换为数组的问题。
但是在这样做时我想知道我们是否可以做这样的事情:
$arrObj = (数组) $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] =>
)
因此,当有人尝试类型转换
我的类对象时,必须有某种方法可以调用用户定义的函数,如下所示:
class Property {
....
....
public function __toArray() {
return <'only public or protected members'>
}
}
当有人使用以下语句时:
$objArray = (array) (new Property());
它应该调用__toArray
方法。与__toString
相同。
如果有人知道任何方法可以做这样的事情,请帮助我。
如果有任何其他解决方案可能会产生相同的输出,那将非常有帮助。
提前致谢。
最佳答案
不幸的是,没有相当于 __toString
的魔法。用于数组转换。多年来已经有一些添加它的提案,以及类似的__toBool
, __toFloat
方法,但都没有取得太大进展(例如 https://wiki.php.net/rfc/object_cast_to_types )
对象支持实现ArrayAccess
接口(interface),它以其他方式将它们视为数组,但它不提供完整转换的方法。
有几个可用的解决方法:
获取对象变量
正如已经提到的,公共(public)属性只能使用 get_object_vars
进行转换方法,例如
class Foo
{
private $x = 1;
protected $y = 2;
public $z = 3;
}
print_r(get_object_vars(new Foo));
Array
(
[z] => 3
)
Json可序列化
JsonSerialized 接口(interface)允许您将自定义逻辑应用于 json_encode
时发生的情况。被调用,它提供了一项改进,因为它允许您包含私有(private)或 protected 属性,或您拥有的任何其他自定义逻辑。
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));
但是,这些都不允许您覆盖使用数组转换本身时发生的情况。希望有一天其中一项提案能够被接受,但在那之前这些都是可用的最佳选择。
关于php自动对象到数组的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37343202/