php自动对象到数组的转换

标签 php arrays oop casting magic-methods

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

Object to Array Conversion

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

$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_decodejson_encode上面的调用当然可以包含在一些简单的语法糖中,例如

function toArray($obj)
{
    return json_decode(json_encode($obj), true);
}

print_r(toArray(new Foo));

但是,这些都不允许您覆盖使用数组转换本身时发生的情况。希望有一天其中一项提案能够被接受,但在那之前这些都是可用的最佳选择。

关于php自动对象到数组的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37343202/

相关文章:

c - 将字符串解析为 C 中的数组?

java - 跳过继承层次并调用父类(super class)的方法的方法

java - 使用 OO 编程避免多个嵌套 if

javascript - 使用ajax提交表单时如何发送电子邮件

php - 自定义价目表的 Paypal 动态下拉菜单

php - 使用 phpSpreadSheet 在 excel 中合并

perl - 为什么子类不继承其父类的常量?

php - SQL 查询不更新 phpmyadmin 中的数据库

c++ - 如果我不自己分配数组元素的值是什么

java - 井字棋盘,WIN方法错误