Exemple d'analyse des hooks PHP et des méthodes de distribution simples

不言
Libérer: 2023-03-24 21:44:02
original
1335 Les gens l'ont consulté

Cet article présente principalement les hooks PHP et les méthodes de distribution simples. Il analyse la définition et l'utilisation des hooks PHP sous forme d'exemples, ainsi que les compétences de mise en œuvre de la commutation gratuite entre plusieurs canaux. Les amis dans le besoin peuvent s'y référer <.>

Les exemples de cet article décrivent des hooks PHP et des méthodes de distribution simples. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

//简单的钩子实现例子
class tool{
  public static function main($class, $fun, $data = &#39;&#39;){
    //前置公共操作
    $con = new $class;
    $con->$fun($data);
    //后置公共操作
  }
}
class a{
  function b($data){
    echo &#39;我是方法b&#39;;
  }
}
class c{
  function d($data){
    echo &#39;我是方法d&#39;;
  }
}
//钩子调用
tool::main(&#39;a&#39;,&#39;b&#39;,&#39;222&#39;);
Copier après la connexion

J'avais initialement prévu d'utiliser des hooks lors de l'encapsulation du canal SMS,

Peut envoyer automatiquement des e-mails SMS (multicanaux), des push et d'autres messages. . .

Plus tard, il a été découvert que les exigences commerciales n'étaient pas aussi complexes qu'on l'imaginait, le développement a donc été abandonné. . . .

T_T Une méthode de distribution simple a donc été adoptée pour réaliser

class Ar_Sms{
  const LANCHUANG = 1;//通道1
  const ALIDAYU = 2; //通道2
  private $type;
  private $chuanglan_config = array(//通道1配置项
    &#39;api_send_url&#39;=>&#39;xxxx&#39;,
    &#39;api_balance_query_url&#39;=> &#39;xxxxx&#39;,
    &#39;api_account&#39;=> &#39;xxxx&#39;,
    &#39;api_password&#39;=> &#39;xxxxx&#39;,
  );
  private $alidayu_config = array(//通道2配置项
    &#39;api_key&#39;=> &#39;xxxx&#39;,
    &#39;api_id&#39;=> &#39;xxxxx&#39;,
    &#39;api_send_url&#39;=> &#39;xxxxx&#39;,
  );
  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 = &#39;false&#39;, $extno = &#39;&#39;){
    $postArr = array (
      &#39;account&#39; => $this->chuanglan_config[&#39;api_account&#39;],
      &#39;pswd&#39; => $this->chuanglan_config[&#39;api_password&#39;],
      &#39;msg&#39; => $msg,
      &#39;mobile&#39; => $mobile,
      &#39;needstatus&#39; => $needstatus,
      &#39;extno&#39; => $extno
    );
    $result = $this->_curlPost( $this->chuanglan_config[&#39;api_send_url&#39;] , $postArr);
    $result = $this->_execResult($result);
    return $result[1] == 0 ? true : $result[1];
  }
  //通道2发送方法
  private function _sendAL($mobile, $msg){
    $postArr = array (
      &#39;id&#39; => $this->alidayu_config[&#39;api_id&#39;],
      &#39;key&#39; => $this->alidayu_config[&#39;api_key&#39;],
      &#39;msg&#39; => $msg,
      &#39;mobile&#39; => $mobile,
    );
    $result = $this->_curlPost( $this->alidayu_config[&#39;api_send_url&#39;] , $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(&#39;xxxxx&#39;,&#39;xxxxxx&#39;);
var_dump($res);
$ob = new Ar_Sms(Ar_Sms::LANCHUANG);//通道2发送
$res = $ob->sendSms(&#39;xxxxx&#39;,&#39;xxxxxx&#39;);
var_dump($res);
Copier après la connexion

Obtenir la liberté du multicanal grâce à un simple changement de distribution,

n'est qu'un simple envoi, donc il n'y a pas d'abstraction supplémentaire ~ 囧orz

L'implémentation du hook est un peu lourde et l'implémentation spécifique doit encore être prise en compte. . Je l'étudierai quand j'aurai le temps. Voici une démo simple. L'idée est la suivante : "Plusieurs canaux, multi-méthodes et prise en charge multi-canal pour une expansion facile


.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal