您能解释下一个有趣的行为吗?
class test { //Class *test* has two properties, public and private. public $xpublic = 'x1'; private $xprivate = 'x2'; } $testObj = new test();
让我们转换$testObj为数组。
$testObj
settype($testObj, 'array'); var_dump($testObj);
结果:
array(2){ [“ xpublic”] =>字符串(3)“ x1” [“ testxprivate”] =>字符串(4)“ x2” }
好,xprivate财产变成testxprivate
xprivate
testxprivate
让我们将此数组转换为对象。
$newObj = (object)$testObj; var_dump($newObj);
object(stdClass)#1(2){ [“ xpublic”] =>字符串(3)“ xxx” [“ xprivate”:“ test”:private] => string(4)“ xxx3” }
$newObj是一个stdClass对象。
$newObj
stdClass
问题是:
为什么要testxprivate成为新对象的私有财产xprivate(不是testxprivate)?PHP如何知道该$testObj数组是一个对象?
如果我定义相等的数组:
$testArray = array('xpublic'=>'x1', 'testxprivate'=>'x2');
然后将其转换为对象:
var_dump((object)$testArray);
我将获得具有两个 公共 属性的对象,xpublic并且testxprivate与预期的一样:
xpublic
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” }
在的输出中var_dump(),空字节不可见。
var_dump()
(更新:添加了受保护的类成员)