2010-03-18 29 views
41

Aparece esta advertencia en mis registros de errores y quería saber cómo corregir estos problemas en mi código.PHP - advertencia - Propiedad indefinida: stdClass - fix?

de advertencia: Aviso PHP: Undefined property: StdClass :: $ registros en script.php en la línea 440

Algunos Código:

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

respuesta si existe registros

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 
) 

Respuesta si no existen registros

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

Estaba pensando algo así como la funcionalidad array_key_exists() pero para objetos, ¿algo? o estoy haciendo esto de la manera incorrecta?

Respuesta

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

puede "o" ser utilizado de alguna manera? ejemplo: $ foo = $ bar-> foo o "predeterminado"; – Hontoni

+1

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

2

La respuesta en sí parece tener el tamaño de los registros. Puede usar eso para verificar si existen registros. Algo así como:

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

Si creo que esto funcionará:

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

parámetros fisico recién definidos incluyen también.

4

Si desea utilizar property_exists, que necesita para obtener el nombre de la clase con get_class()

En este caso sería:

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

En este caso, me gustaría utilizar:

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

usted no recibirá ningún aviso de feas si la propiedad no existe, y usted sabe que en realidad tiene algunos registros para trabajar, es decir. $ response-> records no es una matriz vacía, NULL, FALSE o cualquier otro valor vacío.

-1

Alternativa: simplemente silencie la advertencia con el operador '@'.

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

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

+1

Esto no es una buena práctica, no hagas esto. Código limpiamente – iLLin

+1

Es una cuestión de opinión; No recomendaría usar @ para silenciar las advertencias provenientes de un método, pero como una forma de evitar un millón de llamadas a isset(), es conveniente, funciona, y en mi humilde opinión deja el código mucho más limpio y legible. YMMV. – burlyearly

5

isset() está muy bien para el nivel superior, pero vacío() es mucho más útil para encontrar si los valores se establecen anidados. Por ejemplo:

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

O:

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