2010-03-18 19 views
41

Ricevo questo avviso nei miei log degli errori e volevo sapere come correggere questo problema nel mio codice.PHP - warning - Proprietà non definita: stdClass - correzione?

Attenzione: PHP Avviso: proprietà non definita: stdClass :: $ record in script.php on line 440

Alcuni Codice:

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

risposta se i record esistono

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 
) 

Risposta se i record non esistono

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

Stavo pensando qualcosa come la funzionalità array_key_exists() ma per gli oggetti, qualsiasi cosa? o sto andando su questo nel modo sbagliato?

risposta

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

può "o" essere utilizzato in qualche modo? esempio: $ pippo = $ bar-> pippo o "default"; – Hontoni

+1

Puoi farlo con Elvis $ role_arr = getRole ($ response-> records)?: []; – Pierre

2

la risposta in sé sembra avere le dimensioni dei record. Puoi usarlo per verificare se esistono dei record. Qualcosa di simile:

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

Se penso che questo funzionerà:

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

proprties appena definiti inclusi anche.

4

Se si desidera utilizzare property_exists, è necessario ottenere il nome della classe con get_class()

In questo caso sarebbe:

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

In questo caso, vorrei utilizzare:

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

non avrà nessuna comunicazioni brutto se la proprietà non esiste, e saprete che hai effettivamente avuto alcuni record con cui lavorare, vale a dire. $ response-> records non è un array vuoto, NULL, FALSE o altri valori vuoti.

-1

Alternativa: è sufficiente silenziare l'avviso utilizzando l'operatore '@'.

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

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

+1

Questa non è una buona pratica, non farlo. Codice pulito. – iLLin

+1

È una questione di opinione; Non suggerirei di usare @ per silenziare gli avvertimenti che provengono da un metodo, ma come un modo per evitare una chiamata di bazillion isset(), è conveniente, funziona, e IMHO lascia il codice molto più pulito e più leggibile. YMMV. – burlyearly

5

isset() va bene per il livello superiore, ma vuota() è molto più utile per trovare se i valori nidificati sono impostati. Ad esempio:

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

Oppure:

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