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实现框架(一)
Oct 09 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
Apr 18 PHP
php+iframe实现隐藏无刷新上传文件
Feb 10 PHP
php递归创建和删除文件夹的代码小结
Apr 13 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
Joomla调用系统自带编辑器的实现方法
May 05 PHP
php版微信公众账号第三方管理工具开发简明教程
Sep 23 PHP
php基于dom实现的图书xml格式数据示例
Feb 03 PHP
Thinkphp3.2实用篇之计算型验证码示例
Feb 09 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
Feb 17 PHP
Windows 下安装 swoole 图文教程(php)
Jun 05 PHP
thinkphp5 redis缓存新增方法实例讲解
Mar 24 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学习之整理字符串
2011/04/17 PHP
php中explode与split的区别介绍
2012/10/03 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
jQuery实现带玻璃流光质感的手风琴特效
2015/11/20 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
python实现SOM算法
2018/02/23 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
Django缓存Cache使用详解
2020/11/30 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
跟单文员的岗位职责
2013/11/14 职场文书
企业管理部经理岗位职责
2013/12/24 职场文书
人事专员的职责
2014/02/26 职场文书
学校班班通实施方案
2014/06/11 职场文书
英语系本科生求职信
2014/07/15 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
三峡大坝导游词
2015/01/31 职场文书
上课迟到检讨书
2015/05/06 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书