微信公众号开发之微信公共平台消息回复类

 更新时间:2016年11月25日 17:21  点击:1928
微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,下面给各位分享一个。

初次接触的时候写的一些,有点乱…也没去整理…
ps–最近都不想工作了,各种烦,午饭也没吃,就是想表达一下我过的不好。–请忽略个人情绪往下看。

 代码如下 复制代码

<?php
/**
 * 微信公共平台消息回复类
 *

 *
 */
class BBCweixin{
 
 private $APPID="******";
 private $APPSECRET="******";
 /*
  *文本消息回复
  *@param array object
  *@param string content
  *@return string
  */
 public function resText($object,$content,$flag=0){
  $xmlText="<xml>
                  <ToUserName><![CDATA[%s]]></ToUserName>
                  <FromUserName><![CDATA[%s]]></FromUserName>
                  <CreateTime>%s</CreateTime>
                  <MsgType><![CDATA[text]]></MsgType>
                  <Content><![CDATA[%s]]></Content>
                  <FuncFlag>%d</FuncFlag>
                  </xml>";
     $resultStr=sprintf($xmlText,$object->FromUserName,$object->ToUserName,time(),$content,$flag);
  echo $resultStr;exit();
 }
 /*
  *图片消息回复
  *@param array object
  *@param string url
  *@return string
  */
 public function resImage($object,$media_id){
  $xmlImage="<xml>";
  $xmlImage.="<ToUserName><![CDATA[%s]]></ToUserName>";
  $xmlImage.="<FromUserName><![CDATA[%s]]></FromUserName>";
  $xmlImage.="<CreateTime>%s</CreateTime>";
  $xmlImage.="<MsgType><![CDATA[image]]></MsgType>";
  $xmlImage.="<Image><MediaId><![CDATA[%s]]></MediaId></Image>";
  $xmlImage.="</xml>";
  $resultStr=sprintf($xmlImage,$object->FromUserName,$object->ToUserName,time(),$media_id);
  echo $resultStr;exit();
 }
 /*
  *图文消息回复
  *@param array object
  *@param array newsData 二维数组 必须包含[Title][Description][PicUrl][Url]字段
  *@return string
  */
 public function resNews($object,$newsData=array()){
     $CreateTime=time();
     $FuncFlag=0;
     $newTplHeader="<xml>
        <ToUserName><![CDATA[{$object->FromUserName}]]></ToUserName>
        <FromUserName><![CDATA[{$object->ToUserName}]]></FromUserName>
        <CreateTime>{$CreateTime}</CreateTime>
        <MsgType><![CDATA[news]]></MsgType>
        <Content><![CDATA[%s]]></Content>
        <ArticleCount>%s</ArticleCount><Articles>";
     $newTplItem="<item>
      <Title><![CDATA[%s]]></Title>
      <Description><![CDATA[%s]]></Description>
      <PicUrl><![CDATA[%s]]></PicUrl>
      <Url><![CDATA[%s]]></Url>
      </item>";
     $newTplFoot="</Articles>
      <FuncFlag>%s</FuncFlag>
      </xml>";
     $Content='';
     $itemsCount=count($newsData);
     $itemsCount=$itemsCount<10?$itemsCount:10;//微信公众平台图文回复的消息一次最多10条
     if($itemsCount){
      foreach($newsData as $key=>$item){
       if($key<=9){
      $Content.=sprintf($newTplItem,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);
    }
      }
  }
     $header=sprintf($newTplHeader,0,$itemsCount);
     $footer=sprintf($newTplFoot,$FuncFlag);
     echo $header.$Content.$footer;exit();
 }
 
 /*
  *音乐消息回复
  *@param array object
  *@param array musicContent 二维数组 包含[Title][Description][MusicUrl][HQMusicUrl]字段
  *@return string
  */
 public function resMusic($object,$musicContent=array()){
   $xmlMusic="<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[music]]></MsgType>
                    <Music>
     <Title><![CDATA[%s]]></Title>
                    <Description><![CDATA[%s]]></Description>
                    <MusicUrl><![CDATA[%s]]></MusicUrl>
                    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
                    </Music>
                    </xml>";
  if(empty($musicContent[0]['HQMusicUrl'])){
   $musicContent[0]['HQMusicUrl']=$musicContent[0]['MusicUrl'];
  }
  $resultStr=sprintf($xmlMusic,$object->FromUserName,$object->ToUserName,time(),$musicContent[0]['Title'],$musicContent[0]['Description'],$musicContent[0]['MusicUrl'],$musicContent[0]['HQMusicUrl']);
  echo $resultStr;exit();
 }
 /*
  *上传多媒体文件接口
  *@param
  *@param array mediaArr filename、filelength、content-type
  *@return object
  */
 public function uploadMedia($accessToken,$type='image',$mediaArr){
  $url="http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=".$accessToken."&type=".$type;
  $doPost=self::curlPost($mediaArr,$url);
  return $doPost;
 }
 /*
  *GPS,谷歌坐标转换成百度坐标
  *@param lnt
  *@param lat
  *@return array
  */
 public function mapApi($lng,$lat,$type){
  $map=array();
  if($type=='gps'){
   $url="http://map.yanue.net/gpsApi.php?lat=".$lat."&lng=".$lng;
   $res=json_decode(file_get_contents($url));
   $map['lng']=$res->baidu->lng;
   $map['lat']=$res->baidu->lat;
  }
  if($type=='google'){
   $url="http://api.map.baidu.com/ag/coord/convert?from=2&to=4&mode=1&x=".$lng."&y=".$lat;
   $res=json_decode(file_get_contents($url));
   $map['lng']=base64_decode($res[0]->x);
   $map['lat']=base64_decode($res[0]->y);
  }
  return $map;
 }
 
 /**************************************************************
  *
  *  使用特定function对数组中所有元素做处理
  *  @param  string  &$array     要处理的字符串
  *  @param  string  $function   要执行的函数
  *  @return boolean $apply_to_keys_also     是否也应用到key上
  *  @access public
  *
  *************************************************************/
 public function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
 {
  static $recursive_counter = 0;
  if (++$recursive_counter > 1000) {
   die('possible deep recursion attack');
  }
  foreach ($array as $key => $value) {
   if (is_array($value)) {
    self::arrayRecursive($array[$key], $function, $apply_to_keys_also);
   } else {
    $array[$key] = $function($value);
   }
 
   if ($apply_to_keys_also && is_string($key)) {
    $new_key = $function($key);
    if ($new_key != $key) {
     $array[$new_key] = $array[$key];
     unset($array[$key]);
    }
   }
  }
  $recursive_counter--;
 }
 
 /**************************************************************
  *
  *  将数组转换为JSON字符串(兼容中文)
  *  @param  array   $array      要转换的数组
  *  @return string      转换得到的json字符串
  *  @access public
  *
  *************************************************************/
 public function JSON($array) {
  self::arrayRecursive($array, 'urlencode', true);
  $json = json_encode($array);
  return urldecode($json);
 }
 /*
  *创建菜单
  *
  */
 public function creatMenu($shop_id,$data){
  $jsonArray=self::JSON($data);
  $AccessToken=self::accessToken($weiXin[0]['key'],$weiXin[0]['secret']);
  $MENU_URL="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$AccessToken;
  return self::curlPost($jsonArray,$MENU_URL);
 }
 /*
  *客服消息回复
  *@param array jsonArray Array {"touser":"OPENID","msgtype":"text","text":{"content":"Hello World"}}
  *@return string
  */
 
  public function customService($jsonArray,$hash){
  if(empty($jsonArray)){
   return false; 
  }
  $db=M();
  $sql="select * from bbc_wechats where hash='".$hash."'";
  $weChast=$db->query($sql);
  $AccessToken=self::accessToken($weChast[0]['key'],$weChast[0]['secret']);
  $TokenUrl="https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$AccessToken;
     $CustomRes=self::curlPost($jsonArray,$TokenUrl);
  return $CustomRes;
  }
  /*
 
   *获取access_token
   *@return objectStr
   */
  public function accessToken($appid,$secret){
   $access_token=BBCcache::getCache('accesstoken'.$appid);
   if($access_token){
    $AccessTokenRet=$access_token;
   }else{
    $TookenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
    $AccessTokenRes=@file_get_contents($TookenUrl);
    $AccessToken=json_decode($AccessTokenRes);
    $AccessTokenRet=$AccessToken->access_token;
    BBCcache::setCache('accesstoken'.$appid,$AccessToken->access_token,3600);
   }
   return $AccessTokenRet;
  }
  /*
   *向远程接口POST数据
   *@data Array {"touser":"OPENID","msgtype":"text","text":{"content":"Hello World"}}
   *@return objectArray
   */
  public function curlPost($data,$url){
    $ch = curl_init();
 
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
   curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
   curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
   $info = curl_exec($ch);
 
   if (curl_errno($ch)) {
    echo 'Errno'.curl_error($ch);
   }
 
   curl_close($ch);
   return json_decode($info);
  }
 //根据经纬度计算距离和方向
 function getRadian($d){
  return $d * M_PI / 180;
 }
 
 function getDistance ($lat1, $lng1, $lat2, $lng2){
  $EARTH_RADIUS=6378.137;//地球半径
  $lat1 =getRadian($lat1);
  $lat2 = getRadian($lat2);
 
  $a = $lat1 - $lat2;
  $b = getRadian($lng1) - getRadian($lng2);
 
  $v = 2 * asin(sqrt(pow(sin($a/2),2) + cos($lat1) * cos($lat2) * pow(sin($b/2),2)));
 
  $v = round($EARTH_RADIUS * $v * 10000) / 10000;
 
  return $v;
 }
 
}
 
?>

页面缓存在有的时候是不需要的,我们可以禁止浏览器缓存页面,下面来介绍利用php禁止浏览器使用缓存页面例子。

在PHP中可以轻松的使用下面的语句实现禁止页面缓存,但比较难记特整理下,方便大家使用。

php代码

 代码如下 复制代码

<? php

// 设置此页面的过期时间(用格林威治时间表示),只要是已经过去的日期即可。
header ( " Expires: Mon, 26 Jul 1970 05:00:00 GMT " );

 // 设置此页面的最后更新日期(用格林威治时间表示)为当天,可以强制浏览器获取最新资料
header ( " Last-Modified:" . gmdate ( " D, d M Y H:i:s " ). "GMT " );
 
// 告诉客户端浏览器不使用缓存,HTTP 1.1 协议
 header ( " Cache-Control: no-cache, must-revalidate " );
 
 // 告诉客户端浏览器不使用缓存,兼容HTTP 1.0 协议
header ( " Pragma: no-cache " );

?>

这对于某些页面来说是很有用的,例如:单信息以及订单下的商品,并且清空购物车对应商品数据。

肯定不希望用户到了最后一个页面,都已经生成订单了,再点浏览器的返回按钮回到前一个页面。

那么在订单地址页面加入:

 代码如下 复制代码

header("Cache-Control:no-cache,must-revalidate,no-store"); //这个no-store加了之后,Firefox下有效
header("Pragma:no-cache");
header("Expires:-1");

这个页面不缓存了,并且有个判断购物车商品为空就跳转到空购物车的页面,那么用户点击浏览器后退,回来之后,也直接到 购物车页面了。

magento导入csv文件到数据库方法我们会使用到一个插件了SplFileObject,利用SplFileObject可以实现大数据量导入了,当然我们自己写得也是可以的,但是不一定比这个要好呀。

这是magento脚本的另外一种写法。

个人觉得写的还行,高手莫见笑。

用SplFileObject来处理大数据的csv文件效率高

 

 代码如下 复制代码
<?php
require_once 'shell/abstract.php';
class Faarao_Import_Customer extends Mage_Shell_Abstract
{
protected $_files = array();
protected $_datas = array();
public function __construct() {
parent::__construct();
set_time_limit(0);
if($this->getArg('file')) {
$this->_files = array_merge(
$this->_files,
array_map(
'trim',
explode(',', $this->getArg('file'))
)
);
foreach ($this->_files as $key=>$file) {
$extension = self::get_extension($file);
if($extension != 'csv'){
unset($this->_files[$key]);
}
}
}
if(empty($this->_files)){
die(self::usageHelp());
}
}
// Shell script point of entry
public function run() {
self::getDataFromCsv();
if(empty($this->_datas)){
die("not found data in csv ! \r\n");
}
$emailBooks = array();
foreach ($this->_datas as $name => $datas) {
echo "filename: {$name} =======================\r\n";
$importNum = 0;
foreach ($datas as $key => $data) {
if(empty(trim($data[4]))){
continue;
}
$customerData['firstname'] = trim($data[0]);
$customerData['lastname'] = trim($data[1]);
$customerData['phone'] = trim($data[2]);
$customerData['mobile'] = trim($data[3]);
$customerData['email'] = trim($data[4]);
$customerData['company'] = trim($data[5]);
$customerData['billing_address'] = $data[6] . $data[7] . $data[8];
$customerData['billing_postcode'] = sprintf("%05d",trim($data[9]));
$customerData['billing_city'] = trim($data[10]);
$customerData['billing_country'] = trim($data[11]);
$customerData['shipping_address'] = $data[12] . $data[13] .$data[14];
if(empty($data[15]) && is_numeric($data[16])){
$customerData['shipping_postcode'] = sprintf("%05d",trim($data[16]));
$customerData['shipping_city'] = trim($data[17]);
$customerData['shipping_country'] = trim($data[18]);
}else{
$customerData['shipping_postcode'] = sprintf("%05d", trim($data[15]));;
$customerData['shipping_city'] = trim($data[16]);
$customerData['shipping_country'] = trim($data[17]);
}
// $customerData['email'] = 'zouhongzhao@126.com';
$customerData['country'] = 'Finland';
$customerData['password'] = self::randomkeys(10);
 
&nbsp;
 
echo "customer email {$customerData['email']} ...\r\n";
print_r($customerData);
$customer = Mage::getModel('customer/customer');
$customer->setWebsiteId(Mage::app()->getWebsite()->getId());
$customer->loadByEmail($customerData['email']);
if(!$customer->getId()) {
echo "insert ... \r\n";
$customer->setEmail($customerData['email']);
$customer->setFirstname($customerData['firstname']);
$customer->setLastname($customerData['lastname']);
$customer->setPassword($customerData['password']);
}else{
echo "update ... \r\n";
}
try {
$customer->save();
$customer->setConfirmation(null);
$customer->save();
//Make a "login" of new customer
Mage::getSingleton('customer/session')->loginById($customer->getId());
$importNum ++;
$emailBooks[$customerData['email']] = array(
'firstname'=>$customerData['firstname'],
'lastname'=>$customerData['lastname'],
'customer_mage_id'=>$customer->getId(),
'passwd'=>$customerData['password']
);
 
echo "customer save ok !\r\n";
}
catch (Exception $ex) {
echo "customer save fail !\r\n";
continue;
}
 
if(trim($customerData['billing_address']) == trim($customerData['shipping_address'])
&& $customerData['billing_postcode'] == $customerData['shipping_postcode']
&& $customerData['billing_city'] == $customerData['shipping_city']){
$same_address = array (
'firstname' => $customerData['firstname'],
'lastname' => $customerData['lastname'],
'street' => $customerData['billing_address'],
'company' => $customerData['company'],
'city' => $customerData['billing_city'],
'region_id' => '',
'region' => '',
'postcode' => $customerData['billing_postcode'],
'country_id' => 'FI',
'telephone' => $customerData['phone'],
);
 
$customAddress = Mage::getModel('customer/address');
//$customAddress = new Mage_Customer_Model_Address();
$customAddress->setData($same_address)
->setCustomerId($customer->getId())
->setIsDefaultBilling('1')
->setIsDefaultShipping('1')
->setSaveInAddressBook('1');
try {
$customAddress->save();
echo "sameAddress save ok !\r\n";
}
catch (Exception $ex) {
echo "sameAddress save fail !\r\n";
continue;
}
}else{
$billing_address = array (
'firstname' => $customerData['firstname'],
'lastname' => $customerData['lastname'],
'street' => $customerData['billing_address'],
'company' => $customerData['company'],
'city' => $customerData['billing_city'],
'region_id' => '',
'region' => '',
'postcode' => $customerData['billing_postcode'],
'country_id' => 'FI',
'telephone' => $customerData['phone'],
 
);
self::setBillingAddress($billing_address,$customer);
$shipping_address = array (
'firstname' => $customerData['firstname'],
'lastname' => $customerData['lastname'],
'street' => $customerData['shipping_address'],
'company' => $customerData['company'],
'city' => $customerData['shipping_city'],
'region_id' => '',
'region' => '',
'postcode' => $customerData['shipping_postcode'],
'country_id' => 'FI',
'telephone' => $customerData['phone'],
);
self::setShippingAddress($shipping_address,$customer);
}
// die;
}
echo "import num: {$importNum} =======================\r\n";
}
//save passwd
$fp = fopen('customer_record.log', 'w');
fwrite($fp, json_encode($emailBooks));
fclose($fp);
 
}
 
public function setBillingAddress($data,$customer){
$customerAddress = Mage::getModel('customer/address');
 
if ($defaultShippingId = $customer->getDefaultBilling()){
$customerAddress->load($defaultShippingId);
} else {
$customerAddress
->setCustomerId($customer->getId())
->setIsDefaultBilling('1')
->setSaveInAddressBook('1')
;
 
$customer->addAddress($customerAddress);
}
 
try {
$customerAddress
->addData($data)
->save()
;
echo "BillingAddress save ok !\r\n";
} catch(Exception $e){
// Mage::log('Address Save Error::' . $e->getMessage());
echo "BillingAddress save fail !\r\n";
}
}
 
public function setShippingAddress($data,$customer){
$customerAddress = Mage::getModel('customer/address');
 
if ($defaultShippingId = $customer->getDefaultShipping()){
$customerAddress->load($defaultShippingId);
} else {
$customerAddress
->setCustomerId($customer->getId())
->setIsDefaultShipping('1')
->setSaveInAddressBook('1')
;
 
$customer->addAddress($customerAddress);
}
 
try {
$customerAddress
->addData($data)
->save()
;
echo "ShippingAddress save ok !\r\n";
} catch(Exception $e){
// Mage::log('Address Save Error::' . $e->getMessage());
echo "ShippingAddress save fail !\r\n";
}
}
 
public function randomkeys($length) {
$returnStr='';
$pattern = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ';
for($i = 0; $i < $length; $i ++) {
$returnStr .= $pattern {mt_rand ( 0, 61 )};
}
return $returnStr;
}
public function getDataFromCsv(){
$this->_files = array_unique($this->_files);
$csvCustomers = array();
foreach ($this->_files as $filename) {
echo "current file: {$filename}\r\n";
setlocale(LC_ALL, 'en_US.UTF-8');
$content = file_get_contents($filename);
$data = mb_detect_encoding()($content, 'UTF-8', true);
// $data = iconv("CP1257","UTF-8", $content);
file_put_contents($filename, $content);
 
// fclose($handle);
// print_r($content);die;
$basename = basename($filename,".csv");
$data = array();
$tmp = array();
$spl_object = new SplFileObject($filename, 'rb');
$spl_object->seek(filesize($filename));
$start = 0;
$num = $spl_object->key();
$spl_object->seek($start);
while ($num-- && !$spl_object->eof()) {
$data[] = $spl_object->fgetcsv();
$spl_object->next();
}
foreach ($data as $key => $values) {
if($key == 0){
continue;
}
$mergeValue = explode(';',implode(';', $values));
// if(count($mergeValue) != 20){
// continue;
// }
array_push($tmp,$mergeValue);
}
 
$this->_datas[$basename] = $tmp;
}
return $this;
}
 
public function get_extension($filename){
return pathinfo($filename,PATHINFO_EXTENSION);
}
// Usage instructions
public function usageHelp()
{
return <<<USAGE
Usage: php tetuan_customer_import.php --file a.csv,b.csv
\n
USAGE;
}
}
// Instantiate
$shell = new Faarao_Import_Customer();
// Initiate script
$shell->run();

补充:有一些朋友使用的是excel文档,这样这个程序就不可以使用了,我们可以使用phpexcel插件来读取excel文件并写入到数据库中去哦。

生成唯一不重复的标识我们主要是根据当前的一个时间time然后再转换在md5值,这样几乎是可以保证标签的唯一性了,下面整理了一些关于PHP生成不重复标识符程序代码,希望能各位有帮助。

PHP倒是自带了生成唯一id的函数:uniqid() ,它是基于当前时间微秒数的,用法如下:

 代码如下 复制代码
 echo uniqid(); //13位的字符串
 echo uniqid("php_"); //当然你可以加上前缀
    echo uniqid("php_", TRUE); //如果第二个参数more_entropy为true则生成23位

字符串

但是它生成的标识有可能不是唯一的,所以很多人会:

 代码如下 复制代码

<?php
    //这是第一种简单的方法,当然用sha1()函数也可以。
    echo md5(uniqid());
    //第二种,利用时间戳的方法
    echo md5(time() . mt_rand(1,1000000));
?>

例子。

 代码如下 复制代码

<?
//生成唯一标识符

//sha1()函数, "安全散列算法(SHA1)"

function create_unique() {
    $data = $_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']
     .time() . rand();
    return sha1($data);
    //return md5(time().$data);

    //return $data;

}
?>

例子如下:

<?
$newhash = create_unique();
echo $newhash;
?>

我看到很多人使用 md5() 函数,即使它并不完全意味着这个目的:
 

 代码如下 复制代码

// generate unique string
echo md5(time() . mt_rand(1,1000000));

There is actually a PHP function named uniqid() that is meant to be used for this.

// generate unique string
echo uniqid();
/* prints
4bd67c947233e
*/

// generate another unique string
echo uniqid();
/* prints
4bd67c9472340
*/

你可能会注意到,尽管字符串是唯一的,前几个字符却是类似的,这是因为生成的字符串与服务器时间相关。

但实际上也存在友好的一方面,由于每个新生成的 ID 会按字母顺序排列,这样排序就变得很简单。
为了减少重复的概率,你可以传递一个前缀,或第二个参数来增加:
 

 代码如下 复制代码

// with prefix
echo uniqid('foo_');
/* prints
foo_4bd67d6cd8b8f
*/

// with more entropy
echo uniqid('',true);
/* prints
4bd67d6cd8b926.12135106
*/

// both
echo uniqid('bar_',true);
/* prints
bar_4bd67da367b650.43684647
*/

这个函数将产生比 md5() 更短的字符串,节省一些空间。

php生成全球唯一标识符(GUID)的方法

GUID在空间上和时间上具有唯一性,保证同一时间不同地方产生的数字不同。
世界上的任何两台计算机都不会生成重复的 GUID 值。
需要GUID的时候,可以完全由算法自动生成,不需要一个权威机构来管理。
GUID的长度固定,并且相对而言较短小,非常适合于排序、标识和存储。

 代码如下 复制代码

<?php
//php生成GUID
function getGuid() {
 $charid = strtoupper(md5(uniqid(mt_rand(), true)));
 
 $hyphen = chr(45);// "-"
 $uuid = substr($charid, 0, 8).$hyphen
 .substr($charid, 8, 4).$hyphen
 .substr($charid,12, 4).$hyphen
 .substr($charid,16, 4).$hyphen
 .substr($charid,20,12);

 return $uuid;
}
?>

php中try catch可以帮助我们捕获程序代码的异常了,这样我们可以很好的处理一些不必要的错误了,下面本文章总结了捕获异常的一些用法例子。

pHP中try{}catch{}语句

PHP 5 添加了类似于其它语言的异常处理模块。在 PHP 代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获。(注:一定要先抛才能获取)
需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常。
每一个 try 至少要有一个与之对应的 catch。
使用多个 catch可以捕获不同的类所产生的异常。
当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。
当然,PHP允许在 catch 代码块内再次抛出(throw)异常。
当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch。
如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception ... (未捕获异常)的提示信息。
先来看一下PHP内置异常类的基本属性和方法。(不包括具体实现)

 代码如下 复制代码

try{

}

catch(){

throw new Exception();

}

catch(){

//这里可以捕获到前面一个块抛出的Exception

}


为了进一步处理异常,我们需要使用PHP中try{}catch{}----包括Try语句和至少一个的catch语句。任何调用 可能抛出异常的方法的代码都应该使用try语句。Catch语句用来处理可能抛出的异常。以下显示了我们处理getCommandObject()抛出的异常的方法:

 代码如下 复制代码
< ?php  
try {  
$mgr = new CommandManager();  
$cmd = $mgr->getCommandObject("realcommand");  
$cmd->execute();  
} catch (Exception $e) {  
print $e->getMessage();  
exit();  
}  
?>  

可以看到,通过结合使用throw关键字和PHP中try{}catch{},我们可以避免错误标记“污染”类方法返回的值。因为“异常”本身就是一种与其它任何对象不同的PHP内建的类型,不会产生混淆。

如果抛出了一个异常,try语句中的脚本将会停止执行,然后马上转向执行catch语句中的脚本。

例子如下:
包含文件错误抛出异常

 代码如下 复制代码

<?php
// 错误的演示
try {
require ('test_try_catch.php');
} catch (Exception $e) {
echo $e->getMessage();
}


// 正确的抛出异常
try {
if (file_exists('test_try_catch.php')) {
require ('test_try_catch.php');
} else {
throw new Exception('file is not exists');
}
} catch (Exception $e) {
echo $e->getMessage();
}

如果异常抛出了却没有被捕捉到,就会产生一个fatal error。

多个catch捕获多个异常

PHP将查询一个匹配的catch代码块。如果有多个catch代码块,传递给每一个catch代码块的对象必须具有不同类型,这样PHP可以找到需要进入哪一个catch代码块。当try代码块不再抛出异常或者找不到catch能匹配所抛出的异常时,PHP代码就会在跳转最后一个catch的后面继续执行。多个异常的捕获的示例如下:

 代码如下 复制代码

<?php
    class MyException extends Exception{
           //重定义构造器使第一个参数message变为必须被指定的属性
           public function __construct($message, $code=0){
               //可以在这里定义一些自己的代码
               //建议同时调用parent::construct()来检查所有的变量是否已被赋值
               parent::__construct($message, $code);
           }
           //重写父类中继承过来的方法,自定义字符串输出的样式
           public function __toString(){
               return __CLASS__.":[".$this->code."]:".$this->message."<br>";
           }
           //为这个异常自定义一个处理方法
           public function customFunction(){
               echo "按自定义的方法处理出现的这个类型的异常";
           }
    }
 
    //创建一个用于测试自定义扩展的异常类MyException
    class TestException{
        public $var;           //用来判断对象是否创建成功的成员属性
        function __construct($value=0){              //通过构造方法的传值决定抛出的异常
            switch($value){                          //对传入的值进行选择性的判断
                case 1:                              //掺入参数1,则抛出自定义的异常对象
                    throw new MyException("传入的值“1”是一个无效的参数",5);break;
                case 2:                              //传入参数2,则抛出PHP内置的异常对象
                    throw new MyException("传入的值“2”不允许作为一个参数",6);break;
                default:                             //传入参数合法,则不抛出异常
                    $this->var=$value;break;          //为对象中的成员属性赋值
            }
        }
    }
 
    //示例1,在没有异常时,程序正常执行,try中的代码全部执行并不会执行任何catch区块
    try{
        $testObj =new TestException();           //使用默认参数创建异常的擦拭类对象
        echo "********<br>";                     //没有抛出异常这条语句就会正常执行
    }catch(MyException $e){                      //捕获用户自定义的异常区块
        echo "捕获自定义的异常:$e<br>";          //按自定义的方式输出异常消息
        $e->customFunction();                    //可以调用自定义的异常处理方法
    }catch(Exception $e){                        //捕获PHP内置的异常处理类的对象
        echo "捕获默认的异常:".$e->getMessage()."<br>";       //输出异常消息
    }
    var_dump($testObj);        //判断对象是否创建成功,如果没有任何异常,则创建成功
 
    //示例2,抛出自定义的异常,并通过自定义的异常处理类捕获这个异常并处理
    try{
        $testObj1 =new TestException(1);         //传1时,抛出自定义异常
        echo "********<br>";                     //这个语句不会被执行
    }catch(MyException $e){                      //这个catch区块中的代码将被执行
        echo "捕获自定义的异常:$e<br>";         
        $e->customFunction();                   
    }catch(Exception $e){                        //这个catch区块不会执行
        echo "捕获默认的异常:".$e->getMessage()."<br>";      
    }
    var_dump($testObj1);        //有异常产生,这个对象没有创建成功
 
    //示例2,抛出自内置的异常,并通过自定义的异常处理类捕获这个异常并处理
    try{
        $testObj2 =new TestException(2);         //传入2时,抛出内置异常
        echo "********<br>";                     //这个语句不会被执行
    }catch(MyException $e){                      //这个catch区块中的代码将被执行
        echo "捕获自定义的异常:$e<br>";         
        $e->customFunction();                   
    }catch(Exception $e){                        //这个catch区块不会执行
        echo "捕获默认的异常:".$e->getMessage()."<br>";      
    }
    var_dump($testObj2);        //有异常产生,这个对象没有创建成功
?>

 在上面的代码中,可以使用两个异常处理类:一个是自定义的异常处理类MyException;另一个则是PHP中内置的异常处理类Exception。分别在try区块中创建测试类TestException的对象,并根据构造方法中提供的不同数字参数,抛出自定义异常类对象、内置的异常类对象和不抛出任何异常的情况,跳转到对应的catch区块中执行。如果没有异常发生,则不会进入任何一个catch块中执行,测试类TestException的对象创建成功

[!--infotagslink--]

相关文章

  • 公众号SVG动画交互实战代码

    这篇文章主要介绍了公众号SVG动画交互实战代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-01
  • C#实现微信公众号会员卡管理的示例代码

    这篇文章主要介绍了C#实现微信公众号会员卡管理的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • Vue微信公众号网页分享的示例代码

    这篇文章主要介绍了Vue微信公众号网页分享的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-05-28
  • 如何提高微信搜索排名 8大微信公众号取名套路有讲究

    如何提高微信搜索排名?微信公众号如何取名?8大微信公众号取名套路有讲究!一个好的公众号名称往往能够直接体现出账号的价值、服务、内容、范围、行业等信息,让需要的用户...2017-07-06
  • 微信公众号如何吸粉 微信公众号吸粉不妨用这5招,立竿见影

    微信公众号如何吸粉?如果你正好在运营公众号,而又正好在为涨粉发愁,没有想到更好的解决办法之前不妨用这5招,立竿见影 如果你正好在运营公众号,而又正好在为涨粉发愁,...2017-07-06
  • 如何在电脑上查看微信公众号的历史文章

    打开网页微信,用微信扫描一下登陆网页版的微信,打开之后有一个文件传输助手,把查看历史记录的网址发过去。 发过去的时候,这个网址会自动转换,从“文件传输助手&rd...2016-05-19
  • php版微信实现公众号菜单添加删除操作

    公众号菜单添加删除如果是单号可以直接登录后台操作了,但如果我们开了开发接口那么这个菜单的操作也必须通过接口来实现了,下面我们来看一篇关于php版微信实现公众号菜...2016-11-25
  • 微信公众号别人都在猛赚你却一直在观望

    如果问你现在互联网领域,什么最赚钱?很多人都会第一时间想到微信。微信的出现颠覆了人们以往对营销的认识,微信营销、微店、微商的出现,让微信不再只是简单的通讯软件,更是...2017-07-06
  • 微信公众号实现会员卡领取功能

    这篇文章主要介绍了微信公众号实现会员卡领取功能的相关资料,需要的朋友可以参考下...2017-06-11
  • .NET C#使用微信公众号登录网站

    这篇文章主要介绍了.NET C#使用微信公众号登录网站,教大家利用微信公众号进行网站登录,感兴趣的小伙伴们可以参考一下...2021-09-22
  • 微信公众平台开发教程(三) 基础框架搭建

    这篇文章主要介绍了微信公众平台开发教程(三) 基础框架搭建,具有一定的参考价值,有需要的可以了解一下。...2020-06-25
  • 公众号的秘密,知道一个biz就够了

    微信对于我来说,最有价值的是一个学习渠道,特别是搜狗微信搜索(http://weixin.sogou.com/)能够很方便的搜索公众账号和文章内容,PC端就能够获得特定内容的资源与学习,比如了解SEO...2016-05-19
  • 微信公众号自定义分享内容实现

    微信公众号号在手机中通过api接口可以实现自定义分享内容了,下面我们来看这个接口的实现步骤。 一、准备阶段公众号一个,微网站一个。 二、绑定域名先登录微信公众...2016-11-25
  • ASP.NET Core2静默获取微信公众号的用户OpenId实例代码

    这篇文章主要给大家介绍了关于ASP.NET Core2静默获取微信公众号的用户OpenId的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 新媒体行业:如何打造讨巧的公众号名字?

    对于新媒体从业的小伙伴,取一个讨巧的公众号名字,会给运营带来事半功倍的效果。一个好名字,除了能吸引大家的注意力,方便记忆和传播之外,还是一个有效的涨粉方法。下面就随...2017-07-06
  • 关注公众号即送微信现金红包如何实现?

    关注的时候,会自动post一条信息到开发者配置填写的网址上面,Post过来的数据是一个xml结构的数据,里面包含有openid,拿到openid,就可以给该用户发送微信现金红包了 如何实现...2016-05-19
  • python代码实现扫码关注公众号登录的实战

    本文主要介绍了python代码实现扫码关注公众号登录的实战,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-11-01
  • 微信公众号点击菜单即可打开并登录微站实现步骤

    微信公众号点击菜单即可打开并登录微站实现步骤比较复杂了,但很多微站在己用上了,所以本文章就为各位整理一下吧,希望可以帮助到大家哦。 现在大部分微站都通过用户...2016-11-25
  • 微信公众号判断用户是否已关注php代码解析

    这篇文章主要大家详细解析了微信公众号判断用户是否已关注php代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-07-02
  • 微信公众号菜单、带参数二维码、获取用户信息等 -- hzw

    微信公众号有一个测试系统,在调试的时候,可以用那个测试系统来调试,比较方便,最好不要在实际系统中调试 以前的时候,我是通过网页来获取到用户信息的,现在发现在公...2016-05-19