【问题标题】:Return is undefined but it's defined [duplicate]返回未定义,但已定义[重复]
【发布时间】:2019-10-01 04:19:00
【问题描述】:

我是编程新手,所以也许它很简单,但是当我运行脚本时,它给出的输出是 return $response 没有定义,但它是在数组中定义的。

已经尝试移动 return 语句,但没有帮助

这只是一段代码,但这是产生问题的部分

function request($opt, $data) {
    $request = curl_init();

    foreach ($data as $status) {
        $data_string = json_encode($status);
        echo "Json: " . $data_string . PHP_EOL;

        $headers = array(
            'Content-Type: application/json',
            'Content-Length: ' . strlen($data_string)
        );

        $url = ENDPOINT . $opt['object'];

        curl_setopt($request, CURLOPT_URL, $url);
        curl_setopt($request, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($request, CURLOPT_POST, TRUE);
        curl_setopt($request, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($request, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($request, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($request, CURLOPT_USERPWD, USERNAME . ":" . PASSWORD);

        $response = curl_exec($request);
        if ($response == FALSE) {
            die('<p>Curl failed: ' . curl_error($request) . '</p>');
        }
    }

    return $response;
}

【问题讨论】:

  • 如果$data 为空/不可迭代,则未定义。
  • 确实,$response有条件地定义的。当它没有定义时,你会得到 Undefined variable 错误
  • 还要注意你在循环中覆盖了你的$response,所以在这里使用循环似乎没有多大意义。
  • 无需每次循环重新分配$url。每次都是相同的值,所以在循环之前设置一次即可。

标签: php arrays return


【解决方案1】:

1.你需要在foreach()之前定义$response = array();(因为如果在任何情况下$data是一个空数组,那么$response是未定义的。因为它在foreach()中定义)

2.在您的循环代码中,您覆盖了$response 变量。所以修改如下:

$result = curl_exec($request);
if ($result == FALSE) {
   die('<p>Curl failed: ' . curl_error($request) . '</p>');
}
$response[] = $result;

将常见的 curl 代码放在循环之外,如下所示:-

function request($opt, $data) {

    $url = ENDPOINT . $opt['object'];

    $request = curl_init();curl_setopt($request, CURLOPT_URL, $url);

    curl_setopt($request, CURLOPT_POST, TRUE);
    curl_setopt($request, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($request, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($request, CURLOPT_USERPWD, USERNAME . ":" . PASSWORD);

    $response = array();

    foreach ($data as $status) {
        $data_string = json_encode($status);
        echo "Json: " . $data_string . PHP_EOL;

        $headers = array(
            'Content-Type: application/json',
            'Content-Length: ' . strlen($data_string)
        );

        curl_setopt($request, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($request, CURLOPT_HTTPHEADER, $headers);

        $result = curl_exec($request);
        $response[] = $result;
        if ($result == FALSE) {
            die('<p>Curl failed: ' . curl_error($request) . '</p>');
        }
    }

    return $response;
}

【讨论】:

    【解决方案2】:

    您需要在foreach() 语句之前定义$response

    function request($opt, $data) {
    $request = curl_init();
    $responses = array();
    foreach ($data as $status) {
        $data_string = json_encode($status);
        echo "Json: " . $data_string . PHP_EOL;
    
        $headers = array(
            'Content-Type: application/json',
            'Content-Length: ' . strlen($data_string)
        );
    
        $url = ENDPOINT . $opt['object'];
    
        curl_setopt($request, CURLOPT_URL, $url);
        curl_setopt($request, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($request, CURLOPT_POST, TRUE);
        curl_setopt($request, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($request, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($request, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($request, CURLOPT_USERPWD, USERNAME . ":" . PASSWORD);
    
        $response =  curl_exec($request);
        $responses[] = $response;
    
        if ($response == FALSE) {
            die('<p>Curl failed: ' . curl_error($request) . '</p>');
        }
    }
    
    return $responses;
    }
    

    为什么?因为如果您想访问foreach() 循环之外的任何变量,您必须首先将其定义为全局变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多