【问题标题】:Array to Object and Object to Array in PHP - interesting behaviourPHP中的数组到对象和对象到数组 - 有趣的行为
【发布时间】:2011-09-13 14:29:48
【问题描述】:

你能解释下一个有趣的行为吗?

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 属性变为testxprivate

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

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

我将按预期获得具有两个 public 属性 xpublictestxprivate 的对象:

object(stdClass)#2 (2) {
  ["xpublic"]=> 字符串(2) "x1"
  ["testxprivate"]=> 字符串(2) "x2"
}

【问题讨论】:

    标签: php arrays object casting


    【解决方案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” } 对象(stdClass)#1(3){ ["xpublic"]=> 字符串(2)“x1” ["xprivate":"test":private]=> 字符串(2)“x2” [“xprotected”:受保护]=> 字符串(2)“x3” }

    var_dump()的输出中,空字节是不可见的。

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

    【讨论】:

      【解决方案2】:

      可能 PHP 引擎在内部保留了类结构并简单地提供了某种数组包装器,因此当您再次转换它时,它仍然是私有的,尽管我不能保证 100%。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-08
        • 1970-01-01
        • 1970-01-01
        • 2022-09-26
        相关资源
        最近更新 更多