PHP钩子与简单分发方式实例分析


Posted in PHP onSeptember 04, 2017

本文实例讲述了PHP钩子与简单分发方式。分享给大家供大家参考,具体如下:

//简单的钩子实现例子
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);

通过一个简单的分发实现多通道的自由切换,

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

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

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用PHP中的 == 运算符进行字符串比较
Nov 26 PHP
浅析php中json_encode()和json_decode()
May 25 PHP
PHP中addcslashes与stripcslashes函数用法分析
Jan 07 PHP
抛弃 PHP 代价太高
Apr 26 PHP
详解Laravel视图间共享数据与视图Composer
Aug 04 PHP
PHP简单实现数字分页功能示例
Aug 24 PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 PHP
Thinkphp连表查询及数据导出方法示例
Oct 15 PHP
PHP命名空间简单用法示例
Dec 28 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
Feb 15 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 PHP
php封装的page分页类完整实例代码
Feb 01 PHP
PHP实现登录注册之BootStrap表单功能
Sep 03 #PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
Sep 02 #PHP
php简单读取.vcf格式文件的方法示例
Sep 02 #PHP
PHP实现简单的模板引擎功能示例
Sep 02 #PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 #PHP
PHP设计模式之工厂模式实例总结
Sep 01 #PHP
浅谈关于PHP解决图片无损压缩的问题
Sep 01 #PHP
You might like
php 保留小数点
2009/04/21 PHP
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
php操作access数据库的方法详解
2017/02/22 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
2017/01/05 Javascript
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
python获取当前时间对应unix时间戳的方法
2015/05/15 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
Python使用lambda抛出异常实现方法解析
2020/08/20 Python
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
运动服饰每月订阅盒:Ellie
2018/04/29 全球购物
环保建议书200字
2014/05/14 职场文书
单位承诺书格式
2014/05/21 职场文书
2014年公司工作总结
2014/11/22 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
pytorch 实现变分自动编码器的操作
2021/05/24 Python
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js