初始化 class 并遇到未定义偏移量的问题
Initialise class and having problems with undefined offset
我最近通过我的 php 从程序转向 oop,我从一本书中学习,除了做书中的练习和项目,我还给自己一个现实生活中的项目来做我自己的网站。
我想在我的网站上实现短信功能,在研究该项目时遇到了这个小型 class 库,它连接到我将要使用的公司 API,该库是在 github 上似乎不受支持,我给开发人员的电子邮件被退回。
这是 library,这是我用来初始化它的代码:
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
这些是我收到的错误:
Notice: Undefined offset: 1 in C:\websites\ooptuts\public\classes\class.smsquick.php on line 312
Warning: array_values() expects parameter 1 to be array, boolean given in C:\websites\ooptuts\public\classes\class.smsquick.php on line 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('&', $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;
}
问题是我初始化 class 的方式引起的还是我忽略的东西?..我似乎花了两天 运行 和 google 转了一圈等等,并没有取得太大进展,希望得到其他人的一些建议。
谢谢
因为 reset() returns 一个布尔值。将 reset() 调用移到它自己的行:
reset($retval);
list(, $response) = array_values($retval); // line 282
我应该说它 returns 第一个值,但是在你的情况下它返回 FALSE
此外,第 312 行中您传入的数组可能为空。尝试打印出数组的值以确保。也许您的 CURL 调用没有返回您期望的结果。
我最近通过我的 php 从程序转向 oop,我从一本书中学习,除了做书中的练习和项目,我还给自己一个现实生活中的项目来做我自己的网站。
我想在我的网站上实现短信功能,在研究该项目时遇到了这个小型 class 库,它连接到我将要使用的公司 API,该库是在 github 上似乎不受支持,我给开发人员的电子邮件被退回。
这是 library,这是我用来初始化它的代码:
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
这些是我收到的错误:
Notice: Undefined offset: 1 in C:\websites\ooptuts\public\classes\class.smsquick.php on line 312
Warning: array_values() expects parameter 1 to be array, boolean given in C:\websites\ooptuts\public\classes\class.smsquick.php on line 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('&', $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;
}
问题是我初始化 class 的方式引起的还是我忽略的东西?..我似乎花了两天 运行 和 google 转了一圈等等,并没有取得太大进展,希望得到其他人的一些建议。
谢谢
因为 reset() returns 一个布尔值。将 reset() 调用移到它自己的行:
reset($retval);
list(, $response) = array_values($retval); // line 282
我应该说它 returns 第一个值,但是在你的情况下它返回 FALSE
此外,第 312 行中您传入的数组可能为空。尝试打印出数组的值以确保。也许您的 CURL 调用没有返回您期望的结果。