将对象转换为数组 - 被调用的任何魔术方法?

Maj*_*jql 34 php arrays casting object

我有一个类Foo的对象:

class Foo extends Bar {
    protected $a;
    protected $b;
}

$obj = new Foo();
Run Code Online (Sandbox Code Playgroud)

我想要(并且有)做的是将此对象转换为数组,如下所示:

$arr = (array)$obj;
Run Code Online (Sandbox Code Playgroud)

是否有任何魔法(或不是魔法:))方法此时被调用?或者有没有其他方法来拦截它?我知道我可以写一个简单的方法,例如.asArray()在Foo,但我正在寻找一些更"原生"的PHP方式.

tac*_*one 43

没有

__toArrayPHP中没有神奇的方法.2006年拒绝了一项改进提案,其答案如下:

[2006-08-20 11:12 UTC] helly@php.net

为什么不简单地使用方法asArray()甚至可以作为接口的par:

interface ArrayConversion {function asArray(); }

看,我们有__toString,因为它支持语言结构,如echo,print和其他内部函数.但是我们已经决定反对数组的自动转换.因此,任何语言结构都不会支持它.也就是说没有必要这样做,没有什么可以赢得上述界面.事实上,你会让它变得更复杂,因为你只需添加一个魔术功能.

因此,它不太可能在未来的任何版本中实施(如果你问我,这很可惜).

  • 但是,嘿,我们至少没有得到goto构造?*不寒而栗* (10认同)
  • 请注意:2019 年,PHP 现在正在讨论 __toArray() :https://wiki.php.net/rfc/to-array (3认同)

Exp*_*lls 33

您可以让类实现ArrayAccess接口.这将允许您像对象一样处理对象而不进行强制转换,您可以完全控制成员的使用方式.

  • 虽然很好,但这个答案并没有真正解决这个问题.你至少应该在那里包含"no"这个词:) (35认同)
  • 好点,但在答案开头的某个地方声明,实现“ArrayAccess”接口不足以将对象转换为数组。 (2认同)
  • 还应该注意的是,为了使用“foreach”循环扩展“ArrayAccess”的对象中包含的元素,您还必须实现“\IteratorAggregate”或“\Iterator”。通常,那些希望在对象中重现数组功能的人使用“implements \Countable、\IteratorAggregate、\ArrayAccess”,请参阅 [\ArrayObject](http://php.net/manual/en/class.arrayobject.php)。 (2认同)

Bor*_*éry 14

遗憾的是,转换为数组不会触发任何魔术方法,就像它完成:

$s = (string)$obj;
Run Code Online (Sandbox Code Playgroud)

触发__toString()方法,你可以覆盖.

但是,您可以编写自定义toArray()方法.

您可能还对Serializable可以编写自定义序列化策略的界面感兴趣.