微信/易信公共平台开发(三):记录用户状态,优化程序结构

 

在较早的一篇文章中,实现了一个公共平台PHP类,见http://blog.csdn.net/c80486/article/details/12316305

使用这个类以后,公共平台程序变成以下这样简单的一个形式:

 

主程序只有三行:

  include_once 'jostudio.wechat.php';

  $object = new WeChat(TOKEN, "onMessage"); ////创建一个WeChat类的实例
  $object->process();  //处理消息

 

再写一个消息处理函数

     function onMessage(WeChat $object, $messageType, $content, $arg1, $arg2) { 

                   switch(messageType) {
                              ...   ...

                    }
     }

这种程序结构很像用C语言进行windows编程( 一个WinMain主程序,一个消息处理函数)

 

然而,随着处理逻辑的增加,消息处理函数的代码會變得很复杂(可能有很多个switch),把所有功能写在一个函数中是不好的风格(好的编程风格是一个函数最好不要超过一屏)。

 

一个公共平台往往提供多个应用功能,比如:

     "欢迎您!回复数字选择项目:\r\n1 讲笑话    2 听音乐"

 

上述例子有两个应用,1是讲笑话,2是听音乐。 当然 主菜单选择本身也可以看作是一个应用

我们的程序要记录用户上一次输入时的状态,  比如:記錄用戶當前是在什麼應用狀態,是在主菜單呢、還是在笑话應用、音樂應用。

否则,每次用户输入时,不知道是对哪个应用进行输入。

 

由于公共平台并不提供类似cookie这样的功能,我们必须在自己的网站上记录用户的状态。

為些,我首先寫了一個User類,用於保存用戶狀態。(源碼文件: jostudio.user.php, 下載地址: http://download.csdn.net/detail/c80486/6361281)

一個用戶的數據以文本文件形式保存在一個文件中,文件名是用戶OpenID號,統一放在user目錄下。數據格式採用JSON。

初始状态时,用戶有二個狀態變量:App 和 Stage, 两个变量均为string型

    App  用於記錄用戶當前在哪個應用

   Stage 用於記錄用戶在該應用中完成了哪一步 

 

User类的使用方法:

1, 創建用戶:      $user = new User($openId, $savePath) ;   //savePath是存盤目錄

2, 寫入狀態:      $user->setAppState($app, $stage);      

  寫入狀態值後將自動存盤

3, 讀出App狀態值:      $user->getApp();    

4, 讀出Stage狀態值:      $user->getStage();    

5,设置用户自定义的键值(形如:$key=$value) $user->set($key, $value);

6,读出用户自定义的键值 $user->get($key);

 

 

重新设计这个例子:

 

"欢迎您!回复数字选择项目:\r\n1 讲笑话    2 听音乐"

 

分成三个应用状态:  

    App = "main"     主菜单选择

    App = "joke"     讲笑话

    App = "music"     听音乐

 

修改消息处理函数如下:

     function onMessage(WeChat $object, $messageType, $content, $arg1, $arg2) { 

                   $user = new User($object->fromUser, $savePath) ;    //$object->fromUser就是用户的OpenID

                   switch($user->getApp()) {

                              case "":
                              case "main":

                                       mainMessage($object, $messageType, $content, $arg1, $arg2);

                                       break;

                             case "joke":

                                       jokeMessage($object, $messageType, $content, $arg1, $arg2);

                                       break;

                             case "music":

                                       musicMessage($object, $messageType, $content, $arg1, $arg2);

                                       break;

                    }
     }

 

mainMessage()函数负责主菜单的消息处理, jokeMessage()函数负责笑话应用的消息处理, musicMessage()函数负责音乐应用的消息处理, ...

通过这样修改,通过判断不同的app状态,把消息处理分散到三个函数mainMessage, jokeMessage, musicMessage中,程序优雅很多了。

 

我把三个消息处理函数分别写在三个文件中,每个文件只写一个函数, 再在主程序中include进来

  app.main.php文件包含mainMessage()

        app.joke.php文件包含jokeMessage()

       app.music.php文件包含jokeMessage()

 

这什么要这样拆分一个程序呢? 

这是模块切分的道理,好处是,整体程序合理切分,每一个文件、函数的功能都很清晰简单,耦合程度不高;

每一个函数代码不会很长,容易看懂,不容易出错,也可分工由不同的人编码

 

在实际应用中,我把  switch($user->getApp()) { ... }  这一段也省了

利用PHP的call_user_func()函数,通过判断App名称,动态调用相应的消息处理函数

 

 

具体不再详述,见代码吧 (下载地址:http://download.csdn.net/detail/c80486/6361281)

 

代码在微信/易信平台上测试通过.

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(PHP,微信公共平台)