你能解释下一个有趣的方式吗:
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”] => string(4)“x2”
}
让我们将这个数组转换为对象:
$newObj = (object)$testObj;
var_dump($newObj);
结果:
对象(stdClass)#1(2){
[“xpublic”] => string(3)“xxx”
[“xprivate”:“test”:private] => string(4)“xxx3”
}
问题是:
为什么testxprivate
成为新对象的私有财产xprivate
(而不是testxprivate
)?PHP如何知道该$testObj
数组是一个对象?
如果我定义了相等的数组:
$testArray = array('xpublic'=>'x1', 'testxprivate'=>'x2');
然后将其转换为对象:
var_dump((object)$testArray);
我有两个获得对象的公共属性xpublic
和testxprivate
预期:
对象(stdClass)#2(2){
[“xpublic”] =>字符串(2)“x1”
[“testxprivate”] => string(2)“x2”
}
发布于 2018-03-12 12:37:10
你可以将脚本输出与以下内容进行比较:
$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”
}
对象(stdClass)#1(3){
[ “xpublic”] =>
字符串(2)“x1”
[ “xprivate”: “测试”:私人] =>
字符串(2)“x2”
[ “xprotected”:保护] =>
字符串(2)“x3”
}
在输出中var_dump()
,空字节不可见。
发布于 2018-03-12 13:39:41
PHP引擎很可能保留内部的类结构,并且简单地给出某种数组包装,因此当你再次投射时它仍然是私有的,尽管我无法保证100%。
https://stackoverflow.com/questions/-100007586
复制相似问题