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 相关文章推荐
第八节--访问方式
Nov 16 PHP
php5 pdo新改动加载注意事项
Sep 11 PHP
PHP中MVC模式的模板引擎开发经验分享
Mar 23 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
Apr 09 PHP
php检测文件编码的方法示例
Apr 25 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
php中getservbyport与getservbyname函数用法实例
Nov 18 PHP
php获得文件大小和文件创建时间的方法
Mar 13 PHP
PHP从数组中删除元素的四种方法实例
May 12 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
PHP registerXPathNamespace()函数讲解
Feb 03 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 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生成年月日下载列表的方法
2015/04/24 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
javascript下过滤数组重复值的代码
2007/09/10 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
读jQuery之十 事件模块概述
2011/06/27 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
JS解决url传值出现中文乱码的另类办法
2013/04/08 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
Python文件读取的3种方法及路径转义
2015/06/21 Python
python开发之for循环操作实例详解
2015/11/12 Python
python实现网站的模拟登录
2016/01/04 Python
Python实现翻转数组功能示例
2018/01/12 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
前台接待的工作职责
2013/11/21 职场文书
大学班级干部的自我评价分享
2014/02/10 职场文书
《木笛》教学反思
2014/03/01 职场文书
搞笑车尾标语
2014/06/23 职场文书
长城英文导游词
2015/01/30 职场文书
心术观后感
2015/06/11 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript