stdClass проблема с обнаружением isset, пусто, другое - PullRequest
1 голос
/ 05 июля 2011

Прежде всего позвольте мне начать с того, что я использую CodeIgniter и созданный Эллиот Хогин класс Facebook.http://www.haughin.com/code/facebook/ Что у меня, что работает, найти все хорошо.Однако, когда я тестировал свой код с различными учетными записями FB, я наткнулся на проблему, которую я хотел бы оценить, но мои попытки потерпели неудачу.Я погуглил и нашел другие форумы, и я постоянно придумываю ответы, которые я изначально придумал.Что-то, что должно во что бы то ни стало работать, но в этом случае, похоже, не работает ..

Теперь, когда я сказал это, моя проблема в том ... Объект, который FB передает обратно, не всегда имеет определенныйзапись в нем.Ради этого примера я скажу имя пользователя ..

Вот пример данных, возвращаемых с именем пользователя:

facebookResponse Object
(
    [__construct:private] => 
    [__resp] => stdClass Object
        (
            [data] => stdClass Object
                (
                    [id] => 0000000000000
                    [name] => Random.User
                    [first_name] => Random
                    [middle_name] => ...
                    [last_name] => User
                    [link] => http://www.facebook.com/profile.php?id=000000000
                    [birthday] => 11/26/1980
                    [gender] => male
                    [timezone] => -4
                    [locale] => en_US
                    [verified] => 1
                    [updated_time] => 2011-05-30T19:24:53+0000
                )

Вот пример без имени пользователя:

facebookResponse Object
(
    [__construct:private] => 
    [__resp] => stdClass Object
        (
            [data] => stdClass Object
                (
                    [id] => 000000000000000000000
                    [name] => Random User
                    [first_name] => Random
                    [last_name] => User
                    [link] => http://www.facebook.com/Random.User
                    [username] => Random.User
                    [birthday] => 11/10/1985
                    [hometown] => stdClass Object
                        (
                            [id] => 000000000000000
                            [name] => Coventry, Connecticut
                        )

                    [location] => stdClass Object
                        (
                            [id] => 00000000000000
                            [name] => San Jose, California
                        )

моя последняя неудачная попытка попытаться решить проблему, это выглядит примерно так:

        $fb_result = $this->facebook->call('get', 'me', array('metadata' => 1));
        $fbFirstName = $fb_result->first_name;
        $fbLastName = $fb_result->last_name;
        $fbUserName = $fb_result->username;
        $fbUserId = $fb_result->id;
        $fbHomeTown = $fb_result->hometown->name;
        $fbLocation = $fb_result->location->name;
        echo "<strong>First Name: </strong>"; if((isset($fbFirstName))AND(!empty($fbFirstName))AND(trim($fbFirstName) !== "")){echo $fb_result->first_name ."<br />"; }else{ echo "Not found.<br />"; }
        echo "<strong>Last Name: </strong>"; if((isset($fbLastName))AND(!empty($fbLastName))AND(trim($fbLastName) !== "")){echo $fb_result->last_name."<br />"; }else{ echo "Not found.<br />"; }
        echo "<strong>Username: </strong>"; if((isset($fbUserName))AND(!empty($fbUserName))AND(trim($fbUserName) !== "")){echo $fb_result->username."<br />"; }else{ echo "Not found.<br />"; }
        echo "<strong>User FB ID: </strong>"; if((isset($fbUserId))AND(!empty($fbUserId))AND(trim($fbUserId) !== "")){echo $fb_result->id."<br />"; }else{ echo "Not found.<br />"; }   
        echo "<strong>Location hometown: </strong>"; if((isset($fbHomeTown))AND(!empty($fbHomeTown))AND(trim($fbHomeTown) !== "")){echo $fb_result->hometown->name."<br />"; }else{ echo "Not found.<br />"; }
        echo "<strong>Location current (manual input): </strong>"; if((isset($fbLocation))AND(!empty($fbLocation))AND(trim($fbLocation) !== "")){echo $fb_result->location->name."<br />"; }else{ echo "Not found.<br />"; }

При этом сначала я определяю ее как переменную, а затем проверяю ее с помощью if-else nowработает однако.Теперь я получаю сообщение «Попытка получить свойство не-объекта» из-за ошибки.Это означает, что я предполагаю, что, поскольку его там нет, и я пытаюсь установить его как переменную, независимо от того, возвращает ли она ошибку для него.Я провел лучшую часть дня и вчера, пытаясь решить эту проблему, и я должен сказать, что застрял.Тип ошибки php - не более, чем просто «Уведомление», но я, как правило, не хочу оставлять свой код в состоянии, которое пинает даже так сильно, как ошибка, похожая на эту… При этом я сказал, что я потерян ..

1 Ответ

1 голос
/ 05 июля 2011

Вы не говорите, но это звучит так, как будто ошибка дана для таких строк, как

$fbHomeTown = $fb_result->hometown->name;

когда, например, свойство hometown не существует.

Способ предотвратить это уведомление (и вы обязательно должны стремиться к абсолютно безошибочному коду) - сделать что-то вроде этого:

$fbHomeTown = isset($fb_result->hometown->name) ? trim($fb_result->hometown->name) : null;

Устанавливает для вашей временной переменной известное безопасное значение (либо усеченное значение, либо null). Затем вы можете явно проверить случай, когда не было значения для начала, выполнив

if($fbHomeTown === null) ...  // 3 equal signs

Однако во многих случаях (включая ваш) вам даже не нужно было бы различать «не существует» и «это пустая строка», и вы могли бы легко завершить обработку с помощью чего-то вроде

echo "<strong>First Name: </strong>".
     (empty($fbFirstName) ? "Not found.<br />" : $fbFirstName);
...