本文实例讲述了PHP钩子与简单分发方式。分享给大家供大家参考,具体如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//简单的钩子实现例子
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 于是就采用了一种简单的分发方式来实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
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 );
|
通过一个简单的分发实现多通道的*切换,
由于只是简单的发送所以没有进一步的抽象~ 囧orz
钩子的实现方式,设想有点大,具体的实现还有带考究。。有时间我会研究研究的 这里就抛一个简单的demo吧 设想的是--》多途径 多方式 多通道支持 方便扩展
希望本文所述对大家PHP程序设计有所帮助。
原文链接:http://blog.csdn.net/u014017080/article/details/53184307