#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 окажется пустым. При необходимости вы также можете поместить туда некоторую проверку ошибок