将纯PHP类序列化为关联数组

时间:2010-12-01 16:35:09

标签: php

考虑一个简单的类:

class Token{
    private $hash = "";
    private $userId = "";

    public function  __construct($hash, $userId) {
        $this->hash = $hash;
        $this->userId = $userId;
    }

    public function getHash() {
        return $this->hash;
    }

    public function getUserId() {
        return $this->userId;
    }

    public function setHash($hash) {
        $this->hash = $hash;
    }

    public function setUserId($userId) {
        $this->userId = $userId;
    }
}

尝试将其序列化为关联数组,如下所示:

// the token
$t = new Token("sampleHash", "sampleUser");

// an array for comparison
$retObj = array();
$retObj['hash']   = $t->getHash();
$retObj['userId'] = $t->getUserId();

print_r((array) $t);
echo "<br>";
print_r($retObj);

我明白了:

Array ( [�Token�hash] => sampleHash [�Token�userId] => sampleUser )
Array ( [hash] => sampleHash [userId] => sampleUser )

发生了什么事?如何将序列化修改为第二个打印行?

4 个答案:

答案 0 :(得分:1)

PHP内部使用的名称与您为类变量指定的名称不同。通过这种方式,它可以告诉变量(其名称确实很长)是privateprotected,而不使用除名称之外的任何其他数据(无论如何它都需要)。通过扩展,这将允许编译器告诉您“此变量受到保护,您无法访问它”。

这称为“名称修改”,许多编译器都这样做。 PHP编译器的修改算法恰好使公共变量名称保持不变。

答案 1 :(得分:1)

来自http://www.php.net/manual/en/language.types.array.php#language.types.array.casting

  

如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名,有一些值得注意的例外:整数属性是不可访问的; 私有变量的类名称前置于变量名称;受保护的变量在变量名前面加上'*'。这些前置值在任何一方都有空字节....

答案:他们必须公开

答案 2 :(得分:0)

很奇怪,将成员更改为公开修复它。

class Token{
    public $hash = "";
    public $userId = "";

// ....

有关正在发生的事情的任何见解?

答案 3 :(得分:0)

您可以使用PHP's ReflectionClass编写成员函数。