php钩子和简单的分发方式

来源:互联网 发布:nginx内置变量详解 编辑:程序博客网 时间:2024/05/20 01:37
//简单的钩子实现例子class tool{    public static function main($class, $fun, $data = ''){        //前置公共操作        $con = new $class;        $con->$fun($data);        //后置公共操作    }}class a{    function b($data){        echo '我是方法b';    }}class c{    function d($data){        echo '我是方法d';    }}//钩子调用tool::main('a','b','222');

在封装短信通道的时候本打算用钩子来实现的,

可以自动发送短信(多通道)email,push等消息。。。

后来发现业务需求并没有想象中那么复杂,开发就搁置了。。。。

T_T 于是就采用了一种简单的分发方式来实现

class Ar_Sms{    const LANCHUANG = 1;//通道1    const ALIDAYU = 2;  //通道2    private $type;    private $chuanglan_config = array(//通道1配置项        'api_send_url'=>'xxxx',        'api_balance_query_url'=> 'xxxxx',        'api_account'=> 'xxxx',        'api_password'=> 'xxxxx',    );    private $alidayu_config = array(//通道2配置项        'api_key'=> 'xxxx',        'api_id'=> 'xxxxx',        'api_send_url'=> 'xxxxx',    );    public function __construct($type=1){        switch($type){            case self::LANCHUANG:                $this->type = $type;break;            case self::ALIDAYU:                $this->type = $type;break;            default:                $this->type = false;        }    }    //对外抛出的发送方法    public function sendSms($mobile, $msg){        switch($this->type){            case self::LANCHUANG:                return $this->_sendCL($mobile, $msg);            case self::ALIDAYU:                return $this->_sendAL($mobile, $msg);            default:                return false;        }    }    //通道1发送方法    private function _sendCL($mobile, $msg, $needstatus = 'false', $extno = ''){        $postArr = array (            'account' => $this->chuanglan_config['api_account'],            'pswd' => $this->chuanglan_config['api_password'],            'msg' => $msg,            'mobile' => $mobile,            'needstatus' => $needstatus,            'extno' => $extno        );        $result = $this->_curlPost( $this->chuanglan_config['api_send_url'] , $postArr);        $result = $this->_execResult($result);        return $result[1] == 0 ? true : $result[1];    }    //通道2发送方法    private function _sendAL($mobile, $msg){        $postArr = array (            'id' => $this->alidayu_config['api_id'],            'key' => $this->alidayu_config['api_key'],            'msg' => $msg,            'mobile' => $mobile,        );        $result = $this->_curlPost( $this->alidayu_config['api_send_url'] , $postArr);        $result = $this->_execResult($result);        return $result[1] == 0 ? true : $result[1];    }    //-------------一些公共方法    /**     * 处理返回值\r\n 分割     *     */    private function _execResult($result){        $result=preg_split("/[,\r\n]/",$result);        return $result;    }    /**     * 处理返回值json     *     */    private function _jsonResult($result){        $result=json_decode($result, true);        return $result;    }    /**     * 通过CURL发送HTTP请求     * @param string $url  //请求URL     * @param array $postFields //请求参数     * @return mixed     */    private function _curlPost($url,$postFields){        $postFields = http_build_query($postFields);        $ch = curl_init ();        curl_setopt ( $ch, CURLOPT_POST, 1 );        curl_setopt ( $ch, CURLOPT_HEADER, 0 );        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );        curl_setopt ( $ch, CURLOPT_URL, $url );        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $postFields );        $result = curl_exec ( $ch );        curl_close ( $ch );        return $result;    }}$ob = new Ar_Sms(Ar_Sms::ALIDAYU);//通道1发送$res = $ob->sendSms('xxxxx','xxxxxx');var_dump($res);$ob = new Ar_Sms(Ar_Sms::LANCHUANG);//通道2发送$res = $ob->sendSms('xxxxx','xxxxxx');var_dump($res);
通过一个简单的分发实现多通道的自由切换,

由于只是简单的发送所以没有进一步的抽象~ 囧orz

钩子的实现方式,设想有点大,具体的实现还有带考究。。有时间我会研究研究的 这里就抛一个简单的demo吧 设想的是--》多途径 多方式 多通道支持 方便扩展

0 0
原创粉丝点击