2010-03-18 13 views
41

Ich bekomme diese Warnung in meinen Fehlerprotokollen und wollte wissen, wie ich diese Probleme in meinem Code beheben kann.PHP - Warnung - Nicht definierte Eigenschaft: stdClass - fix?

Warnung: PHP Hinweis: Nicht definierte Eigenschaft: stdClass :: $ Aufzeichnungen in script.php on line 440

Einige Code:

// Parse object to get account id's 
// The response doesn't have the records attribute sometimes. 
$role_arr = getRole($response->records); // Line 440 

Antwort, wenn Aufzeichnungen

stdClass Object 
(
    [done] => 1 
    [queryLocator] => 
    [records] => Array 
     (
      [0] => stdClass Object 
       (
        [type] => User 
        [Id] => 
        [any] => stdClass Object 
         (
          [type] => My Role 
          [Id] => 
          [any] => <sf:Name>My Name</sf:Name> 
         ) 

       ) 

     ) 

    [size] => 1 
) 

existiert Antwort, wenn Datensätze nicht existieren

stdClass Object 
(
    [done] => 1 
    [queryLocator] => 
    [size] => 0 
) 

Ich dachte etwas wie array_key_exists() Funktionalität, aber für Objekte, alles? oder gehe ich das falsch herum?

Antwort

93
if(isset($response->records)) 
    print "we've got records!"; 
+0

kann "oder" irgendwie verwendet werden? Beispiel: $ foo = $ bar-> foo oder "default"; – Hontoni

+1

Du kannst es mit Elvis machen $ role_arr = getRole ($ response-> records)?: []; – Pierre

2

Die Antwort selbst die Größe der Datensätze zu haben scheint, verwenden können. Sie können damit prüfen, ob Datensätze existieren. Etwas wie:

if($response->size > 0){ 
    $role_arr = getRole($response->records); 
} 
1

Wenn Sie denken, dies funktionieren wird:

if(sizeof($response->records)>0) 
$role_arr = getRole($response->records); 

neu definiert proprties enthalten auch.

4

Wenn Sie property_exists verwenden möchten, müssen Sie den Namen der Klasse mit get_class()

In diesem Fall zu bekommen wäre es:

if(property_exists(get_class($response), 'records')){ 
     $role_arr = getRole($response->records); 
} 
else 
{ 
     ... 
} 
4

In diesem Fall würde ich verwenden:

if (!empty($response->records)) { 
// do something 
} 

Sie erhalten keine hässlichen Benachrichtigungen erhalten, wenn die Eigenschaft nicht existiert, und Sie wissen, Sie haben einige Datensätze tatsächlich bekam, mit zu arbeiten, das heißt. $ response-> records ist kein leeres Array, NULL, FALSE oder andere leere Werte.

-1

Alternativ: die Warnung nur mit dem Operator '@' stummschalten.

$ var = getRole (@ $ response-> records);

See: http://php.net/manual/en/language.operators.errorcontrol.php

+1

Dies ist keine gute Übung, tue das nicht. Sauber codieren. – iLLin

+1

Es ist eine Frage der Meinung; Ich würde nicht vorschlagen, @ zu verwenden, um Warnungen, die von einer Methode kommen, zum Schweigen zu bringen, aber als eine Möglichkeit, bazillion isset() -Aufrufe zu vermeiden, ist es praktisch, funktioniert und IMHO lässt den Code viel sauberer und lesbarer. YMMV. – burlyearly

5

isset() ist für Top-Level in Ordnung, aber leer() ist viel nützlicher zu finden, ob verschachtelte Werte eingestellt sind. ZB:

if(isset($json['foo'] && isset($json['foo']['bar'])) { 
    $value = $json['foo']['bar'] 
} 

Oder:

if (!empty($json['foo']['bar']) { 
    $value = $json['foo']['bar'] 
} 
Verwandte Themen