php自动对象到数组转换

时间:2016-05-20 09:37:54

标签: php arrays oop casting magic-methods

我想将我的类对象转换为数组。我已经问过一个关于如何将对象转换为数组的问题。

Object to Array Conversion

但是在这样做时我想知道我们是否可以做这样的事情:

$ 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相同。

如果有人知道如何做这样的事情,请帮助我。

如果有任何其他解决方案可能导致相同的输出将非常有帮助。

先谢谢。

2 个答案:

答案 0 :(得分:2)

不幸的是,对于数组转换,没有相当于__toString的魔法。多年来有一些建议要添加它,以及类似的__toBool__toFloat方法,但它们都没有取得多大进展(例如https://wiki.php.net/rfc/object_cast_to_types

对象支持实现ArrayAccess接口,它以其他方式处理它们像数组一样,但它没有提供完整转换的方法。

有几种可用的解决方法:

get_object_vars

如前所述,只能使用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

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_decodejson_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
)