如何解决PHP中的对象到对象和对象到数组-有趣的行为
|| 您能解释下一个有趣的行为吗?class test {
//Class *test* has two properties,public and private.
public $xpublic = \'x1\';
private $xprivate = \'x2\';
}
$testObj = new test();
让我们将$testObj
转换为数组。
settype($testObj,\'array\');
var_dump($testObj);
结果:
数组(2){
[\“ xpublic \”] =>字符串(3)\“ x1 \”
[\“ testxprivate \”] =>字符串(4)\“ x2 \”
}
好吧,xprivate
属性变成becomes4ѭ
让我们将此数组转换为对象。
$newObj = (object)$testObj;
var_dump($newObj);
结果:
object(stdClass)#1(2){
[\“ xpublic \”] =>字符串(3)\“ xxx \”
[\“ xprivate \”:\“ test \”:private] =>字符串(4)\“ xxx3 \”
}
$newObj
是stdClass
对象。
问题是:
为什么testxprivate
成为新对象的私有财产xprivate
(而不是testxprivate
)? PHP如何知道$testObj
数组是一个对象?
如果我定义相等的数组:
$testArray = array(\'xpublic\'=>\'x1\',\'testxprivate\'=>\'x2\');
然后将其转换为对象:
var_dump((object)$testArray);
我将按预期获得具有两个公共属性xpublic
和testxprivate
的对象:
object(stdClass)#2(2){
[\“ xpublic \”] =>字符串(2)\“ x1 \”
[\“ testxprivate \”] =>字符串(2)\“ x2 \”
}
解决方法
数组键包含一个标记,该标记应为类测试的私有属性。
将脚本输出与以下内容进行比较:
$array = array(
\"xpublic\" => \"x1\",# this will become a private member:
\"\\x00test\\x00xprivate\" => \"x2\",# this will become a protected member:
\"\\x00*\\x00xprotected\" => \"x3\"
);
var_dump($array);
$obj = (object) $array;
var_dump($obj);
序列化时,使用相同的字符串描述私有成员。
输出:
数组(3){
[\“ xpublic \”] =>
字符串(2)\“ x1 \”
[\“ testxprivate \”] =>
字符串(2)\“ x2 \”
[\“ * xprotected \”] =>
字符串(2)\“ x3 \”
}
object(stdClass)#1(3){
[\“ xpublic \”] =>
字符串(2)\“ x1 \”
[\“ xprivate \”:\“ test \”:private] =>
字符串(2)\“ x2 \”
[\“ xprotected \”:protected] =>
字符串(2)\“ x3 \”
}
在“ 17”的输出中,空字节不可见。
(更新:添加了受保护的类成员)
, PHP引擎可能会保留内部的类结构,并仅提供某种数组包装器,因此,当您再次对其进行转换时,它仍然是私有的,尽管我不能100%保证这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。