Переменная в функции не видна? - PullRequest
0 голосов
/ 04 августа 2010
<?php function curl($mail){

    $go = curl_init();
    $access_token = '1234567890|5fabcd37ef194fee-1752237355|JrG_CsXLkjhcQ_LeYPU.';
    curl_setopt($go, CURLOPT_URL,'https://graph.facebook.com/search?q='.$mail.'&type=user&access_token='.$access_token);
    curl_setopt($go, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");
    curl_setopt($go, CURLOPT_POST, 0);
    curl_setopt($go, CURLOPT_HEADER, 0);
    curl_setopt($go, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($go, CURLOPT_SSL_VERIFYPEER, false);
    $json = curl_exec($go);
    curl_close($go);

    $arr = json_decode($json,1);
    if(isset($arr['data']['0']['id'])) {
        return $arr['data']['0']['id'];
    } else {
        return false;
    }
} ?>

Я помещаю $name = $arr['data']['0']['name']; прямо над return $arr['data']['0']['id']; Однако я не могу отобразить переменную $name после запуска $a = curl($mail);

Ответы [ 3 ]

3 голосов
/ 04 августа 2010

Если вы имеете в виду это:

function abc() {
    if(isset($arr['data']['0']['id'])) {
        $name = $arr['data']['0']['name'];
        return $arr['data']['0']['id'];
    }
    ...
}
echo $name;

Это невозможно, если вы не объявите $ name как глобальное.Переменная $ name имеет локальную область видимости и не может быть использована вне функции, если она не является глобальной.Существуют и другие приемы (например, переменная-ссылка в качестве параметра-функции), которая также достигает вашей цели.

Редактировать для справочного примера:

$refVar = 'foo';
function withRef(&$var) {
    echo $var; // returns 'foo'
    $var = 'bar';
    return 'return some other value';
}
$result = withRef($refVar);
echo $refVar; // now returns 'bar'
2 голосов
/ 04 августа 2010

Конечно нет.Локальная переменная остается локальной, она не просачивается наружу.У вас есть хоть малейшее представление, сколько хавок это может вызвать, если это сработает?Вы никогда не можете полагаться на то, что локальные переменные некоторых функций не скрывают ваши собственные.

Возвращает некоторую структуру данных (например, массив ('name' => ..., 'id' => ...))из которого звонящий может получить необходимую ему информацию.Или используйте опорный параметр и установите его.

1 голос
/ 04 августа 2010

Если вы не обновляете глобальную переменную (использование которой не является наилучшей практикой), единственный способ «получить доступ» к переменной, присутствующей в функции / методе, - это если функция / метод возвращает требуемое значение илипринимает переменную по ссылке в качестве параметра и обновляет переменную.

т.е.:

// curl returns the required value.
$name = curl('email@xxx');

или

// The curl function optionally accepts the '$name' parameter
// which can be overwritten in its original scope.
function curl($email, &name=null) {
    ...
    $name = 'xxx';
    ...
}

if(curl('email@xxx', $name))
...

Это связано с тем, что переменные в функциях/ методы / классы и т. д. видны только в той области, с которой они определены.(Это хорошо.)

Подробнее об этом можно прочитать по адресу: http://php.net/manual/en/language.variables.scope.php

Между прочим, у меня возникнет соблазн не называть функцию "curl", так как эторискованно с точки зрения конфликта с существующей функцией - что-то вроде «fetchUserData» может быть лучшим подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...