Vreemd stdClass object

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • _Moe_
  • Registratie: Mei 2006
  • Laatst online: 04-08 14:45
Deze output krijg ik bij print_r:

code:
1
2
3
4
5
6
stdClass Object
(
    [text] => Dit is een test
    [source] => web
    ....
)


Deze output krijg ik bij var_dump:
code:
1
2
3
4
5
object(stdClass)#17 (23) {
    [text] => Dit is een test
    [source] => web
    ....
}


En als ik nu bijvoorbeeld het volgende doe:
PHP:
1
echo $obj->text;


dan krijgen we de volgende error terug:
"Trying to get property of non-object"

Aangezien het over object gaat kunnen we de eigenschap ook niet als volgt aanroepen:
PHP:
1
echo $obj['text'];

Indien we dit toch proberen, krijgen we volgende error terug:
"Cannot use object of type stdClass as array"

Iemand een idee, hoe ik dan wel aan mijn eigenschappen van het object kan geraken?

RTFM!


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Werkt dit:

PHP:
1
echo $obj->{'text'};


En hoe kom je aan dit object?

[ Voor 28% gewijzigd door HuHu op 02-01-2014 14:58 ]


Acties:
  • 0 Henk 'm!

  • _Moe_
  • Registratie: Mei 2006
  • Laatst online: 04-08 14:45
HuHu schreef op donderdag 02 januari 2014 @ 14:57:
Werkt dit:

PHP:
1
echo $obj->{'text'};


En hoe kom je aan dit object?
"Trying to get property of non-object"

RTFM!


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 14:20

DataGhost

iPL dev

Post eens een minimale testcase waarin het gebeurt, dan kunnen we hier ook meekijken.

Acties:
  • 0 Henk 'm!

  • _Moe_
  • Registratie: Mei 2006
  • Laatst online: 04-08 14:45
DataGhost schreef op donderdag 02 januari 2014 @ 15:02:
Post eens een minimale testcase waarin het gebeurt, dan kunnen we hier ook meekijken.
Ik haal met de Twitter library codebird(PHP) de tweets van mijn timeline op en ik probeer nu het resultaat in mijn view te proppen.

PHP:
1
2
3
4
5
$tweets = $cb->statuses_userTimeline();

foreach($tweets as $tweet){
    echo $tweet->text;
}


Meer is het niet, en het zou ook geen rocket science mogen zijn. Alleen gedraagt die parameter zich nogal vreemd.

RTFM!


Acties:
  • 0 Henk 'm!

  • Geo001
  • Registratie: November 2009
  • Laatst online: 17-09 16:06
misschien $tweet[0]->text; ?

Acties:
  • 0 Henk 'm!

  • koesie10
  • Registratie: Mei 2011
  • Niet online
Je kan ook een var_export doen, dan kunnen wij meteen het object reproduceren.

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 22:00
regel 1: tweets moet zijn $tweets ?

Acties:
  • 0 Henk 'm!

  • _Moe_
  • Registratie: Mei 2006
  • Laatst online: 04-08 14:45
rutgerw schreef op donderdag 02 januari 2014 @ 15:12:
regel 1: tweets moet zijn $tweets ?
kopieer foutje

RTFM!


Acties:
  • 0 Henk 'm!

  • Firesphere
  • Registratie: September 2010
  • Laatst online: 16-09 09:06

Firesphere

Yoshis before Hoshis

Je hebt toch de oAuth library die je gebruikt?

I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!


Acties:
  • 0 Henk 'm!

  • koesie10
  • Registratie: Mei 2011
  • Niet online
Ik heb het even getest met die library, en het klopt dat je die fout krijgt. Ze geven een stdClass terug bij statuses_userTimeline(). Dit object bestaat uit allemaal objecten van tweets en als laatste element de HTTP status code. Je zult die dus niet moeten meenemen, door het bijvoorbeeld te casten naar een array en het laatste element te unsetten.

Of je doet unset($tweets->httpstatus).

[ Voor 5% gewijzigd door koesie10 op 02-01-2014 15:23 ]


Acties:
  • 0 Henk 'm!

  • _Moe_
  • Registratie: Mei 2006
  • Laatst online: 04-08 14:45
Firesphere schreef op donderdag 02 januari 2014 @ 15:16:
Je hebt toch de oAuth library die je gebruikt?
Codebird maakt daar gebruik van ja.

Maar daar ligt het probleem ook niet lijkt me, want ik krijg het juiste resultaat terug, ik kan het alleen niet ontleden :(.

RTFM!


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Welk CODEBIRD_RETURNFORMAT gebruik je?

Acties:
  • 0 Henk 'm!

  • Firesphere
  • Registratie: September 2010
  • Laatst online: 16-09 09:06

Firesphere

Yoshis before Hoshis

_Moe_ schreef op donderdag 02 januari 2014 @ 15:21:
[...]


Codebird maakt daar gebruik van ja.

Maar daar ligt het probleem ook niet lijkt me, want ik krijg het juiste resultaat terug, ik kan het alleen niet ontleden :(.
Als't goed is, kun je in die defaut oAuth library, domweg zeggen dat'ie naar associative array moet gooien ipv een object.
Volgens mij los je daarmee in 1x het probleem op.

I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!


Acties:
  • 0 Henk 'm!

  • bReChThOu
  • Registratie: Januari 2007
  • Laatst online: 14-09 11:50

bReChThOu

Team Belgium

Alternatief:

PHP:
1
2
3
4
5
6
$tweets = $cb->statuses_userTimeline();

foreach($tweets as $tweet){
    $tweetarray = (array)$tweet;
    echo $tweetarray->text;
}

Acties:
  • 0 Henk 'm!

Verwijderd

bReChThOu schreef op donderdag 02 januari 2014 @ 15:24:
Alternatief:

PHP:
1
2
3
4
5
6
$tweets = $cb->statuses_userTimeline();

foreach($tweets as $tweet){
    $tweetarray = (array)$tweet;
    echo $tweetarray->text;
}
Je probeert nu wel $tweetarray als een object te benaderen. Volgens mij bedoel je
PHP:
1
2
3
4
5
6
$tweets = $cb->statuses_userTimeline();

foreach($tweets as $tweet){
    $tweetarray = (array)$tweet;
    echo $tweetarray['text'];
}

Acties:
  • 0 Henk 'm!

  • bReChThOu
  • Registratie: Januari 2007
  • Laatst online: 14-09 11:50

bReChThOu

Team Belgium

@DaBananaboat: Correct, ik was te snel :) Je m'excuse!

Acties:
  • 0 Henk 'm!

  • _Moe_
  • Registratie: Mei 2006
  • Laatst online: 04-08 14:45
Firesphere schreef op donderdag 02 januari 2014 @ 15:23:
[...]

Als't goed is, kun je in die defaut oAuth library, domweg zeggen dat'ie naar associative array moet gooien ipv een object.
Volgens mij los je daarmee in 1x het probleem op.
thnx! opgelost!
koesie10 schreef op donderdag 02 januari 2014 @ 15:20:
Ik heb het even getest met die library, en het klopt dat je die fout krijgt. Ze geven een stdClass terug bij statuses_userTimeline(). Dit object bestaat uit allemaal objecten van tweets en als laatste element de HTTP status code. Je zult die dus niet moeten meenemen, door het bijvoorbeeld te casten naar een array en het laatste element te unsetten.

Of je doet unset($tweets->httpstatus).
Dit was achteraf gezien dus het probleem dat ik over het hoofd zag!

Dank allen!

RTFM!


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Volgende keer de volledige output van print_r / var_dump geven dus :P.

Acties:
  • 0 Henk 'm!

  • _Moe_
  • Registratie: Mei 2006
  • Laatst online: 04-08 14:45
HuHu schreef op donderdag 02 januari 2014 @ 15:36:
Volgende keer de volledige output van print_r / var_dump geven dus :P.
Mja, dat doen we meestal niet zo graag he :)

RTFM!


Acties:
  • 0 Henk 'm!

  • Firesphere
  • Registratie: September 2010
  • Laatst online: 16-09 09:06

Firesphere

Yoshis before Hoshis

_Moe_ schreef op donderdag 02 januari 2014 @ 15:44:
[...]


Mja, dat doen we meestal niet zo graag he :)
Waarom niet? Twitter is nou niet heel erg geheim ofzo. Dus als je direct had gezegd dat't Twitter oAuth json objectje was, had je sneller je antwoord gehad.

En evt. een dump van een random account, zoals bijvoorbeeld die van tweakers.net zelf, aangezien het effect daar hetzelfde is/zal zijn.

I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

koesie10 schreef op donderdag 02 januari 2014 @ 15:20:
Ik heb het even getest met die library, en het klopt dat je die fout krijgt. Ze geven een stdClass terug bij statuses_userTimeline(). Dit object bestaat uit allemaal objecten van tweets en als laatste element de HTTP status code. Je zult die dus niet moeten meenemen, door het bijvoorbeeld te casten naar een array en het laatste element te unsetten.

Of je doet unset($tweets->httpstatus).
Je doet overkomen alsof dit allemaal heel erg logisch is 8)7 maar waarom zou je daarom geen properties uit het object moeten kunnen lezen?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Firesphere
  • Registratie: September 2010
  • Laatst online: 16-09 09:06

Firesphere

Yoshis before Hoshis

.oisyn schreef op donderdag 02 januari 2014 @ 16:52:
[...]


Je doet overkomen alsof dit allemaal heel erg logisch is 8)7 maar waarom zou je daarom geen properties uit het object moeten kunnen lezen?
Omdat het laatste element, de HTTP_STATUS, geen object, maar een string is?

I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

You're not making any sense. Definieer "laatste element", ik dacht dat daarmee bedoeld werd het laatste element ("member") in het object. Wat maakt het uit wat dat zelf voor type is?

.edit: oh ik denk dat ik het snap. De fout is dat _Moe_ over een array heen loopt en alle elementen behandelt als objecten, terwijl er een element (de laatste) in zit dat geen object is. Waarbij _Moe_ dus vergeet te vertellen dat zijn print_r helemaal niet slaat op het object dat hij daadwerkelijk probeert te accessen 8)7

[ Voor 47% gewijzigd door .oisyn op 02-01-2014 17:02 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Firesphere
  • Registratie: September 2010
  • Laatst online: 16-09 09:06

Firesphere

Yoshis before Hoshis

.oisyn schreef op donderdag 02 januari 2014 @ 16:56:
You're not making any sense. Definieer "laatste element", ik dacht dat daarmee bedoeld werd het laatste element ("member") in het object. Wat maakt het uit wat dat zelf voor type is?
Ehm, ik stel het als vraag, omdat ik niet exact uit m'n hoofd weet wat er precies terug komt dan als HTTP_STATUS.

Maar als het type van het xe element iets anders is dan een object, kun je't ook niet aanspreken alsof het een object is.
Of dat nu het eerste of het laatste element is, doet er eigenlijk niet toe.

I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Als je een var_dump gedaan had op je totale response had je dit meteen kunnen zien. In de topicstart post je dus een irrelevant stuk code eigenlijk, dat is wat .oisyn bedoelt.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Debugging tipje: gebruik Xdebug om door je code te steppen totdat de fout optreedt, of doe even een guard om je foreach blokje heen de volgende keer. Dan ben je er binnen no time achter:

PHP:
1
2
3
4
5
6
7
8
<?php
foreach ($a as $k => $v) {
   if (!is_object($v)) {
      var_dump($k, $v);
      continue;
   } 
   // do other supposed stuff
}


offtopic:
Lang leve het feit dat PHP geen verschil maakt tussen dictionaries en lists...

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1