廢話不多說,直接上程式碼
當前寫法
- 代碼: 選擇全部
switch($_POST["f"])
{
...
case "chara":
include("./class/wog_act_chara.php");
$wog_act_class = new wog_act_chara;
switch ($_POST["act"])
{
case "login":
$wog_act_class->login($bbs_id,$p_ip);
break;
case "status_view":
$wog_act_class->show_chara($HTTP_COOKIE_VARS["wog_cookie"],$userid,3);
break;
case "make":
$wog_act_class->chara_make();
break;
case "save":
$wog_act_class->chara_save($bbs_id);
break;
case "revive":
$wog_act_class->revive($HTTP_COOKIE_VARS["wog_cookie"]);
break;
case "logout":
if($HTTP_COOKIE_VARS["wog_cookie"]=="")
{
alertWindowMsg($lang['wog_act_nologin']);
}
$wog_act_class->logout($HTTP_COOKIE_VARS["wog_cookie"]);
break;
case "view2":
$wog_act_class->system_view2($HTTP_COOKIE_VARS["wog_cookie"]);
break;
case "cp":
$wog_act_class->cp_view();
break;
case "kill":
$wog_act_class->kill();
break;
}
break;
...
}
wog功能一多,一大串的case都眼花了
今天發現了非常簡潔的寫法
- 代碼: 選擇全部
$className='wog_act_'.$_POST["f"]; //class名稱,因為post f 值為後半部class名稱,這邊合併成完整的名稱 (wog_act_chara)
$path='./class/'.$className.'.php'; //class所在的php文件路徑 (./class/wog_act_chara.php)
if(file_exists($path)) //php文件是否存在
{
include($path); //include進來
if(class_exists($className)) //class是否存在
{
$wog_act_class=new $className(); //等同於 $wog_act_class=new wog_act_chara;
$methodName=$_POST["f"].'_'.$_POST["act"]; //要呼叫的函式,函式名稱通常都是由f & act組成的 (chara_save)
if(method_exists($wog_act_class,$methodName)) //函式是否存在
{
$wog_act_class->$methodName($_COOKIE["wog_cookie"]); 呼叫函式
}
}
}
以上方法使wog_act.php從數百行縮至數十行,加上不用一個一個的去對case,效率應該多了不少
不過需求就是需要post f的值為php文件的名稱以及class名稱的後半部,php文件的名稱以及class名稱也要相同
class裡的函式名稱也須要由post f 和 post act 組成 (chara_save),當然也可以只有act (save),不過容易跟其它class裡的函式搞混 (shop_view & bid_view ---> view & view)
還有php版本也要注意,不確定用變量建立class以及訪問class裡的函式需要幾版的php,我想至少要php 5.3吧 @@