2010-12-01 3 views
0

Рассмотрим простой класс:Сериализация простой класс 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) 

Что происходит? Как исправить сериализацию, чтобы она выглядела как вторая строка печати?

ответ

1

От http://www.php.net/manual/en/language.types.array.php#language.types.array.casting

Если объект преобразуется в массив, результат представляет собой массив, элементами которого являются свойства объекта. Ключи - это имена переменных-членов, с несколькими заметными исключениями: целочисленные свойства недоступны; частные переменные имеют имя класса, добавленное к имени переменной; защищенные переменные имеют «*», добавленные к имени переменной. Эти значения имеют которые начинаются с нулевыми байтами по обе стороны ....

Ответ: они должны быть общедоступными

0

Странно, сменив участников на общественное положение.

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

// .... 

Любое понимание того, что происходит?

+0

Ответ, вероятно, в ваших геттерах ... можете ли вы их скопировать или вставить? – Nicolas 2010-12-01 16:41:45

1

PHP внутренне использует разные имена, чем те, которые вы указываете для своих переменных класса. Таким образом, он может сказать, что переменная (чье имя может быть довольно длинным) - private или protected без использования каких-либо дополнительных данных, кроме своего имени (что в любом случае понадобилось). В дополнение, это то, что позволит компилятору рассказать вам, «эта переменная защищена, вы не можете получить к ней доступ».

Это называется «манипулирование именем», и многие компиляторы делают это. Алгоритм манипуляции с компилятором PHP просто приводит к тому, что общедоступные имена переменных остаются нетронутыми.

Смежные вопросы