考虑一个简单的类:
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 )
发生了什么事?如何将序列化修改为第二个打印行?
答案 0 :(得分:1)
PHP内部使用的名称与您为类变量指定的名称不同。通过这种方式,它可以告诉变量(其名称确实很长)是private
或protected
,而不使用除名称之外的任何其他数据(无论如何它都需要)。通过扩展,这将允许编译器告诉您“此变量受到保护,您无法访问它”。
这称为“名称修改”,许多编译器都这样做。 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编写成员函数。