get_object_vars() 与强制转换为数组
Posted
技术标签:
【中文标题】get_object_vars() 与强制转换为数组【英文标题】:get_object_vars() vs. cast to array 【发布时间】:2011-01-31 12:24:49 【问题描述】:get_object_vars($obj)
和 (array) $obj
之间有什么区别吗?
两者似乎都返回了对象的公共属性。
哪个更好?
【问题讨论】:
【参考方案1】:这并不完全正确。
get_object_vars
是范围敏感的,并且将返回所有 可见 属性,除了 静态 属性,无论它们的可见性如何。如果你从课堂外调用它,你只会得到公共成员;从派生类中,您将获得受保护的和公共的成员;从班级本身,你会得到所有的成员。数组键代表属性名称,不会被破坏。
(array)
转换至少在 php 5.3.0 上返回所有对象属性,公共的和其他的。属性的名称根据其保护级别进行了修改:
public
: 未损坏,与属性名称相同
protected
:属性的键名以 *
开头
private
: 属性的键名以类名开头
更多信息请参见casting to an array。
希望您能够更好地了解哪一种最适合您的情况。
【讨论】:
要添加,对于(array)
演员表,*
用于受保护的成员和 classname 用于私有成员将包含在空字节(\x00
)中,所以严格来说,受保护成员是\x00*\x00
,私有成员也是如此:\x00className\x00
。相关:Array to Object and Object to Array in PHP - interesting behaviour
另一个区别(至少在 PHP 5 中):get_object_vars
的键如果是数字将被转换为 int,其中转换返回字符串索引:3v4l.org/2Wb9j
(array)
的另一个特点是它不会包含 static
属性,无论其可见性如何。【参考方案2】:
get_object_vars()
函数是实现你想要的效果的更清晰的方法。虽然将其转换为数组也是一种解决方案,但这种行为可能会在以后的 PHP 版本中发生变化。
我不知道这两种方法之间是否存在实际差异,但上面的参数会引导我使用该函数。
【讨论】:
为什么数组转换的行为不如函数可靠?你有支持它的文件吗?【参考方案3】:更好的是你真正需要的。 get_object_vars() 不显示私有成员和受保护成员。示例见手册中的this comment。
【讨论】:
以上是关于get_object_vars() 与强制转换为数组的主要内容,如果未能解决你的问题,请参考以下文章