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下安装配置fckeditor编辑器的方法
Mar 02 PHP
Views rows style模板重写代码
May 16 PHP
解析crontab php自动运行的方法
Jun 24 PHP
Laravel 5 学习笔记
Mar 06 PHP
php中动态调用函数的方法
Mar 16 PHP
PHP性能分析工具XHProf安装使用教程
May 13 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
Sep 29 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
PHP设计模式之模板方法模式定义与用法详解
Apr 02 PHP
php设计模式之职责链模式定义与用法经典示例
Sep 19 PHP
Yii框架where查询用法实例分析
Oct 22 PHP
PHP底层运行机制与工作原理详解
Jul 31 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 has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
php swoft框架实例用法
2020/12/22 PHP
使用jquery给input和textarea设定ie中的focus
2008/05/29 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
[01:16:28]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第二场 2月23日
2021/03/11 DOTA
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
使用pip发布Python程序的方法步骤
2018/10/11 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
python 多个参数不为空校验方法
2019/02/14 Python
Python实现二叉树的常见遍历操作总结【7种方法】
2019/03/06 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
django rest framework serializers序列化实例
2020/05/13 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
委托书样本
2014/04/02 职场文书
艺术教育实施方案
2014/05/03 职场文书
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js