一尘不染

数组到对象和对象到数组在PHP中-有趣的行为

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);

结果:

array(2){
  [“ xpublic”] =>字符串(3)“ x1”
  [“ testxprivate”] =>字符串(4)“ x2”
}

好,xprivate财产变成testxprivate

让我们将此数组转换为对象。

$newObj = (object)$testObj;
var_dump($newObj);

结果:

object(stdClass)#1(2){
  [“ xpublic”] =>字符串(3)“ xxx”
  [“ xprivate”:“ test”:private] => string(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”
}

阅读 314

收藏
2020-05-29

共1个答案

一尘不染

数组键包含一个标记,该标记应为类测试的私有属性。

将脚本输出与以下内容进行比较:

$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(),空字节不可见。

(更新:添加了受保护的类成员)

2020-05-29