PHP массив в преобразовании объекта в строку (насколько я могу судить) - PullRequest
0 голосов
/ 29 ноября 2008

Я разрабатываю интерфейсный код для веб-приложения и столкнулся со странной проблемой с пользовательским объектом. Когда я запрашиваю объект и использую print_r(), я получаю это (объект намного больше; просто обрежьте его до соответствующего кода):

MemberInfo Object
(
    [meta_data] => Array
    (
        [email_recommendations] => true
        [email_updates] => false
    )
)

Чтобы что-то изменить в объекте MemberInfo, я просто обновляю его свойства и отправляю его обратно на сервер с помощью второй функции. Так, например, страница загружается один раз (что дает нам объект, показанный выше), затем я отправляю запрос POST с изменениями при второй загрузке страницы. Во время второй загрузки я извлекаю объект выше, по-разному устанавливаю одно поле на основе POST с чем-то вроде $memberInfo->meta_data['email_recommendations'] = 'false';, а затем использую эту версию объекта для заполнения страницы после запуска функции обновления (что-то вроде updateMember($memberInfo); ). Однако, как только я изменил значение свойства объекта, print_r() показывает мне что-то другое:

MemberInfo Object
(
    [meta_data] => {\"email_recommendations\":\"false\",\"email_updates\":\"false\"}

)

Я уверен, что пропускаю что-то очень глупое; кто-нибудь имеет хорошее представление о том, что я должен искать? Я проверил, и код бэкэнда не передается по ссылке (вызов функции updateMember(MemberInfo $memberInfo);), но я немного шаткую при обработке объекта PHP 5, поэтому я не уверен, что может пойти не так.

Я не ожидаю углубленной отладки; Мне просто нужно знать общее направление, в котором я должен искать причину этого изменения свойства, которое по всем правам должно быть массивом.

Заранее спасибо!

1 Ответ

1 голос
/ 29 ноября 2008

так вы используете объект после вызова updateMember()? Объекты PHP5 по умолчанию передаются по ссылке, поэтому, если вы вызываете json_encode() для свойства meta_data, оно будет демонстрировать поведение, которое вы описываете.

Возможно, вы захотите опубликовать функцию updateMember() для подтверждения, но похоже, что это именно то, что происходит.

есть:

class MemberInfo {
    function __construct()  {
        $this->meta_data = array(
            'email_recommendations' => true,
            'email_updates' => false,
        );
    } 
}

function updateMember($meminfo) {
    $meminfo->meta_data = json_encode($meminfo->meta_data);
    // do stuff
}

$meminfo = new MemberInfo();

updateMember($meminfo);

print_r($meminfo); // you'll see the json encoded value for "meta_data"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...