2016-10-17 51 views
1

我最近从程序到OOP与我的PHP,即时通讯从一本书学习,以及做这本书中的练习和项目,我也给自己一个现实生活项目为我自己的网站做。初始化类和有未定义的偏移量的问题

我想实现一个短信功能到我的网站,而研究项目遇到这个小型图书馆连接到我将使用的公司的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 

这些都是错误我收到:

注意:未定义偏移:用C 1:\在线312

警告:array_values()期望参数1是数组,布尔在C:\ websites \ ooptuts \ public \ classes \ class.smsquick中给出。第282行的php

线路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; 
} 

是否引起如何我正在初始化类的问题或者是我忽略的东西?..我似乎花了两天与谷歌等圈子跑来跑去,并没有取得很大的进展,并希望得到别人的一些建议。

谢谢

回答

1

因为reset()返回一个布尔值。移动复位()调用自己的路线:

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

我应该说,但是它返回的第一个值,在你的情况下,它返回FALSE

PHP Manual: reset()

而且,其可能在第312行,你传入的数组是空的。尝试打印出数组的值来确保。也许你的CURL电话没有返回你所期望的。

+1

你当然是在正确的轨道上,我没有改变重置线,问题是与SSL证书,我上周重新安装Wamp,愚蠢地忘记包括cacert.pem我的Wamp文件夹显然返回通过卷曲响应的错误数据。非常感谢。标记为已回答。 – MartinJJ

+0

很高兴我能帮到你。说实话,我反过来读了这个问题。我应该首先提出CURL呼叫的建议,但我读到这个问题的方式让它落后了。仍然我会保持重置呼吁在自己的线路,以防止$ retval值结束为空。如有必要,您可以在那里进行一些错误检查 – Matt1776