2014-01-07 1 views
0

Как получить доступ к значению stdClass с двоеточием «: protected»?Доступ к значению StdClass с двоеточием: protected

К примеру, у меня был $ OBJ с этим результатом:

object(Google_Service_Plus_PeopleFeed)#14 (11) { 
    ["title"]=> 
    string(30) "Google+ List of Visible People" 
    ["totalItems"]=> 
    int(4) 
    ["collection_key:protected"]=> 
    string(5) "items" 
    ["data:protected"]=> 
    array(1) { 
    ["items"]=> 
    array(2) { 
     [0]=> 
     array(7) { 
     ["kind"]=> 
     string(11) "plus#person" 
     ["etag"]=> 
     string(57) ""42gOj_aEQqJGtTB3WnOUT5yUTkI/1eNkvlfeTwXXldr9rYAvMcwM6bk"" 
     ["objectType"]=> 
     string(6) "person" 

Например, я попытался получить доступ к «доброму» значению, которое «плюс # людей», используя этот код:

$kind = $obj->{'data:protected'}->items[0]->kind; //-> returns NULL 
//OR 
$kind = $obj->{data:protected}->items[0]->kind; //->returns error on ":" 

Ну, они, похоже, не работают ... Любая идея, как получить доступ к этим защищенным данным?

Благодаря

+0

Нет ли у вас аксессуаров? –

ответ

4

Это не объект stdClass, это объект класса Google_Service_Plus_PeopleFeed. Вы не можете получить доступ к защищенным свойствам класса [легко]. Если класс не хочет, чтобы вы обращались к данным, вам не следует. Но обычно класс предлагает некоторый метод, который вы можете вызвать для получения данных, например $obj->getData() или некоторые из них. Посмотрите на определение класса или его документацию, чтобы узнать, как вы должны использовать этот класс.

+0

Я вижу. Итак, из того, что я получил, мне нужно выяснить, как получить доступ к защищенным данным внутри класса? Спасибо –

+0

Это не на 100% правильно. Вы можете получить доступ к защищенным членам класса по-разному! Вы можете использовать Reflection, или вы можете подкласс, или вы можете даже использовать закрытие. См. Мой ответ. –

+0

@ Mathias. Конечно, существует множество способов обойти «защищенные» свойства. ** Но вы не должны. ** Они помечаются как «защищенные» по какой-то причине. Если вы не знаете, что делаете, вы должны использовать открытый API *, который обязательно существует, если вы должны получить доступ к этим данным. – deceze

0

Ну, я могу, наконец, получить доступ к нему с:

$kind = $obj['data']['items'][0]['kinds']; 

Кто-нибудь может объяснить, почему? Просто любопытно, почему его нужно защищать>. <

+0

Это означает, что класс реализует интерфейс 'ArrayAccess', поэтому вы можете получить к нему доступ, как массив. Там, вероятно, все еще есть метод getter. – deceze

0

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

Если вам нужно получить доступ к защищенным переменным, вы можете использовать Reflection, но может быть проще. Связывая замыкание с объектом, вы должны иметь доступ к защищенным переменным из укупорочного средства:

class X { 
    protected $a = 10; 
    public $b = 20; 
} 


$closure = function() { 
      return get_object_vars($this); 
}; 

$result = Closure::bind($closure, new X(), 'X'); 
var_dump($result()); 

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

  • Нет связанных вопросов^_^