//简单的钩子实现例子
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;//通道1const ALIDAYU = 2; //通道2private $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吧 设想的是--》多途径 多方式 多通道支持 方便扩展