<?php
namespace Common\Logic\Wechat;

class Curl
{
    
    /**
     * curl资源
     * @var unknown
     */
    protected $ch;
    
    /**
     * 配置
     * @var array
     */
    protected $opt_arr = array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => false,
        CURLOPT_NOSIGNAL => true
    );
    
    /**
     * curl_exec函数返回值
     * @var array
     */
    protected $result;
    
    /**
     * curl_getinfo函数返回值
     * @var array
     */
    protected $curl_info;
    
    public function __construct()
    {
        $this->_init();
    }
    
    /**
     * 设置配置信息
     * @param int 键
     * @param mixed 值
     * @return \Common\Logic\Wechat\Curl
     */
    public function setOpt($key, $val)
    {
        $this->opt_arr[$key] = $val;
        return $this;
    }
    
    /**
     * 设置url
     * @param string url
     * @return \Common\Logic\Wechat\Curl
     */
    public function setUrl($url)
    {
        return $this->setOpt(CURLOPT_URL, $url);
    }
    
    /**
     * 设置https请求
     * @return \Common\Logic\Wechat\Curl
     */
    public function setHttps()
    {
        return $this
        ->setOpt(CURLOPT_SSL_VERIFYPEER, false)
        ->setOpt(CURLOPT_SSL_VERIFYHOST, 2);
    }
    
    /**
     * 初始化
     * @throws \Exception
     */
    protected function _init()
    {
        $ch = curl_init();
        if (!$ch) throw new \Exception('初始化Curl错误');
        
        $this->ch = $ch;
    }
    
    /**
     * 设置请求方式为get
     * @return \Common\Logic\Wechat\Curl
     */
    public function setGet()
    {
        return $this->setOpt(CURLOPT_POST, false);
    }
    
    /**
     * 设置请求方式为post
     * @return \Common\Logic\Wechat\Curl
     */
    public function post()
    {
        return $this->setOpt(CURLOPT_POST, true);
    }
    
    /**
     * 发送请求
     */
    public function request()
    {
        curl_setopt_array($this->ch, $this->opt_arr);
        
        // 取得请求结果
        $this->result = curl_exec($this->ch);
        $error = curl_errno($this->ch);
        $this->curl_info = curl_getinfo($this->ch);
        
        if ($error > 0) throw new \Exception('Curl 错误:' . curl_strerror ($error) . '(' . $error . ')');
        
        return $this;
    }
    
    public function __get($att)
    {
        switch ($att) {
            case 'result':
            case 'curl_info':
                return $this->$att;
        }
        
        throw new \Exception($att . ' is not fund');
    }
}