本文实例讲述了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