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产生随机字符串函数
Dec 06 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
Apr 22 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
PHP的Yii框架的基本使用示例
Aug 21 PHP
PHP读书笔记_运算符详解
Jul 01 PHP
php 人员权限管理(RBAC)实例(推荐)
May 24 PHP
PHP hex2bin()函数用法讲解
Feb 25 PHP
PHP标准库(PHP SPL)详解
Mar 16 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 PHP
浅谈Laravel中的三种中间件的作用
Oct 13 PHP
Laravel 框架返回状态拦截代码
Oct 18 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 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
php实现的SESSION类
2014/12/02 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
Vue组件开发初探
2017/02/14 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
2020/07/22 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
Python下的subprocess模块的入门指引
2015/04/16 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
如何基于Python实现数字类型转换
2020/02/07 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
零基础小白多久能学会python
2020/06/22 Python
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
几个MySql的面试题
2013/04/22 面试题
《盲人摸象》教学反思
2014/02/16 职场文书
项目经理聘任书
2014/03/29 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
具结保证书范本
2015/05/11 职场文书
请客吃饭开场白
2015/06/01 职场文书
初中同学会致辞
2015/08/01 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
Vue和Flask通信的实现
2021/05/19 Vue.js
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang