Инициализировать класс и возникли проблемы с неопределенным смещением

#php #oop #offset

#php #ооп #смещение

Вопрос:

Недавно я перешел от процедурного к ооп с моим php, я изучаю книгу и, помимо выполнения упражнений и проектов в книге, я также даю себе реальный проект для своего собственного веб-сайта.

Я хочу внедрить функцию sms на свой веб-сайт и, исследуя проект, наткнулся на эту небольшую библиотеку классов, которая подключается к API компании, которую я буду использовать, библиотека находится на github и, похоже, не поддерживается, и мои электронные письма разработчику возвращаются.

Это библиотека, и это код, который я использую для ее инициализации:

 require_once('classes/class.smsquick.php');

$username = "someuser";
$password = "somepass";

$api = new SmsQuick($username, $password);

//uncommenting the line below returns undefined_index @ line 312 and 282
//$available_credits = $api->checkBalance(); 

//var_dump($api); //used for checking
  

Это ошибки, которые я получаю:

Обратите внимание: неопределенное смещение: 1 в C:websitesooptutspublicclassesclass.smsquick.php на линии 312

Предупреждение: array_values() ожидает, что параметр 1 будет массивом, логическим значением, заданным в C:websitesooptutspublicclassesclass.smsquick.php в строке 282

строки 312 и 282 указаны в следующих двух методах, требуются последние два метода, поэтому я также показал их:

 public function checkBalance() {
    $vars = array(
        'username' => $this->api_username,
        'password' => $this->api_password,
        'action' => 'balance',
    );

    $retval = $this->executeApiRequest($vars);
    list(, $response) = array_values(reset($retval)); // line 282

    return (int) $response;
}

/**
 * Helper method to execute an API request.
 *
 * @param array $vars
 *   Data to POST to SMS gateway API endpoint.
 *
 * @return array
 *   Response from SMS gateway.
 */
public function executeApiRequest($vars) {
    // Basic validation on the authentication details
    foreach ($vars as $key => $value) {
        switch ($key) {
            case 'username':
            case 'password':
                if (empty($value)) {
                    throw new Exception('API username or password not specified.');
                }
                break;
        }
    }

    $data = $this->preparePostData($vars);
    $retval = $this->executePostRequest($data);

    list($status, $response) = explode(':', $retval); // line 312
    if ($status == 'ERROR') {
        throw new Exception(strtr('There was an error with this request: !error.', array('!error' => $response)));
    }

    $data = array();
    $lines = explode("n", $retval);
    foreach (array_filter($lines) as $i => $line) {
        $line = trim($line);
        $data[$i] = explode(':', $line);
    }

    return $data;
}

protected function preparePostData($data) {
    $post_data = array();
    foreach ($data as $key => $value) {
        switch ($key) {
            case 'to':
                // Support multiple phone numbers.
                $value = implode(',', array_unique($value));
                break;
        }
        $post_data[] = $key . '=' . rawurlencode($value);
    }

    return implode('amp;', $post_data);
}

protected function executePostRequest($data) {
    $ch = curl_init($this->api_endpoint);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $retval = curl_exec($ch);
    curl_close($ch);
    return $retval;
}
  

Проблемы вызваны тем, как я инициализирую класс, или чем-то, что я упускаю из виду ?.. кажется, я провел два дня, бегая по кругу с Google и т. Д., И Не добился большого прогресса, и был бы признателен за некоторые советы от других.

Спасибо

Ответ №1:

Потому что reset() возвращает логическое значение. Переместите вызов reset() в его собственную строку:

 reset($retval);
list(, $response) = array_values($retval); // line 282
  

Я должен сказать, что он возвращает первое значение, однако в вашем случае он возвращает FALSE

Из руководства по PHP: reset ()

Кроме того, возможно, что в строке 312 массив, который вы передаете, пуст. Попробуйте распечатать значение массива, чтобы убедиться. Возможно, ваш вызов CURL возвращает не то, что вы ожидаете.

Комментарии:

1. Вы, конечно, были на правильном пути, мне не нужно было менять строку сброса, проблема была с ssl-сертификатом, я переустановил Wamp на прошлой неделе и тупо забыл включить cacert.pem в мою папку Wamp, которая, очевидно, возвращала неверные данные через ответ curl. Большое спасибо. Помечено как ответ.

2. Рад, что смог помочь. Честно говоря, я прочитал проблему наоборот. Я должен был предложить сначала просмотреть вызов CURL, но то, как я прочитал проблему, у меня было обратное. Тем не менее, я бы оставил вызов reset в своей собственной строке на случай, если значение $retval окажется пустым. При необходимости вы также можете поместить туда некоторую проверку ошибок