Это невероятно старый поток, но, чтобы не путать других авторов, которым интересно, как используются магические методы для получения / установки свойств в PHP и как это влияет на кодировку JSON, вот мое понимание.
Включение в класс методов __get и __set дает вам интерфейс для работы с динамически именованными свойствами для данного класса. Большинство людей определяют внутренний ассоциативный массив, который ведет домашнюю работу.
Причина, по которой ваш пример foo / bar не отображается в кодировке JSON, заключается в том, что вы просто создаете ассоциацию, которая возвращает значение. Это не установка свойства в самом объекте к этому значению.
Если вы сделали что-то вроде:
набор открытых функций ($ name, $ value) {
$ this-> data [$ name] = $ value;
}
Тогда, если вы позвонили:
$ foo = new ObjectClass;
$ Foo-> набор ( 'Foo', 'бар');
теперь в этом массиве есть элемент $ data ['foo'] = 'bar'
если вы json_encode объекта, то это отношение будет представлено.
json_encode не кодирует методы, только свойства. Там нет никакого способа обойти это. Для вашего кода, функционального эквивалента вашего волшебного __get, можно было бы включить в конструктор вызов set, который «жестко связывает» значение свойства с именем «foo».
В конечном счете, я не знаю, с какой спецификой вы боретесь, поскольку вы не предоставили много деталей. Однако json_encoding для объекта или массива просто выдаст вам список доступных свойств. Если вам нужно пройти через функцию интерпретации и каким-то образом полагаться на нее, это другая проблема, на которую, к сожалению, я не могу ответить.
Надеюсь, это поможет, хотя это часть устаревшей темы, которая, по иронии судьбы, IMO, содержит решение.