2010-03-18 15 views
41

Otrzymuję to ostrzeżenie w moich dziennikach błędów i chciałem wiedzieć, jak rozwiązać ten problem w moim kodzie.PHP - ostrzeżenie - Niezdefiniowana właściwość: stdClass - poprawka?

ostrzegawcze: PHP Wskazówka: niezdefiniowanej właściwości: stdClass :: $ rekordy w script.php on line 440

Niektóre Kod:

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

Response jeśli zapisy istnieje

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 
) 

Odpowiedź, jeśli rekordy nie istnieją

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

Myślałem o czymś takim jak funkcja array_key_exists(), ale o obiektach, cokolwiek? czy podchodzę do tego w niewłaściwy sposób?

Odpowiedz

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

może "lub" być wykorzystywane w jakiś sposób? przykład: $ foo = $ bar-> foo lub "default"; – Hontoni

+1

Możesz to zrobić za pomocą Elvis $ role_arr = getRole ($ response-> records)?: []; – Pierre

2

odpowiedź sama wydaje się mieć wielkość zapisów. Możesz użyć tego do sprawdzenia, czy istnieją zapisy. Coś jak:

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

Jeśli to zadziała:

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

nowo zdefiniowane o parametrach zawiera też.

4

Jeśli chcesz użyć property_exists, musisz uzyskać nazwę klasy z get_class()

W tym przypadku byłoby to:

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

W tym przypadku, chciałbym używać:

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

nie dostaniesz żadnych brzydkich zawiadomienia, jeżeli nieruchomość nie istnieje, a ty wiesz, że rzeczywiście dostał kilka rekordów do pracy, tj. $ response-> records nie jest pustą tablicą, NULL, FALSE ani żadnymi innymi pustymi wartościami.

-1

Alternatywa: wystarczy wyciszyć ostrzeżenie za pomocą operatora "@".

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

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

+1

To nie jest dobra praktyka, nie rób tego. Kod czysto. – iLLin

+1

Jest to kwestia opinii; Nie sugerowałbym używania @ do wyciszania ostrzeżeń pochodzących z metody, ale jako sposób na uniknięcie wywołania isset(), jest to wygodne, działa, a IMHO pozostawia kod znacznie bardziej przejrzysty i czytelny. YMMV. – burlyearly

5

isset() jest w porządku na najwyższym poziomie, ale pusta() jest znacznie bardziej użyteczne, aby znaleźć czy zagnieżdżone wartości są ustawione. Np:

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

Lub:

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