習慣 ASP.NET WebForms 事件驅動開發的工程師,可透過簡單封裝在 PHP 中實現類似 Page_Load、Button_Click 的事件模式,適合邏輯不複雜的頁面快速開發。
page.php<?php
require_once '../inc/EventHelper.php';
function Page_Load() {
echo '每次請求都會執行<br>';
if (!Page::IsPostBack()) {
echo '首次載入:載入產品分類<br>';
if ($_GET['cmd'] == 'edit') {
echo '編輯模式:載入產品資料<br>';
}
}
}
function bAdd_Click() {
echo "bAdd_Click 執行新增邏輯<br>";
}
function bEdit_Click() {
echo 'proID=' . $_GET['proID'] . '<br>';
echo "bEdit_Click 執行修改邏輯<br>";
}
function sdfsdfdsf_Click() {
echo "其他按鈕事件<br>";
}
?>
<form name="aa" method="post" action="?<?=Comm::GetParam()?>">
<input type="submit" name="bAdd" value="新增" />
<input type="submit" name="bEdit" value="修改" />
<input type="submit" name="sdfsdfdsf" value="其他" />
</form>
EventHelper.php<?php
class Page {
public static function IsPostBack() {
global $SYSRunEventName;
return !empty($SYSRunEventName);
}
public static function EventLoad() {
global $SYSRunEventName;
$userFuncs = get_defined_functions()['user'];
$postKeys = array_keys($_POST);
foreach ($postKeys as $key) {
$name = strtolower($key);
foreach ($userFuncs as $func) {
$funcName = str_ireplace('_click', '', $func);
if ($name == strtolower($funcName)) {
$SYSRunEventName = $func;
break 2;
}
}
}
if (function_exists('Page_Load')) Page_Load();
if (Page::IsPostBack()) {
$SYSRunEventName(); // 呼叫對應的 *_Click 函數
}
}
}
class Comm {
public static function GetParam($params = array(), $cmd = 'addoverride') {
$all = array();
if ($cmd == 'addoverride') {
foreach (array_keys($params) as $k) {
if (!isset($all[$k])) $all[$k] = $params[$k];
}
} elseif ($cmd == 'del') {
foreach ($params as $k) unset($_GET[$k]);
}
foreach (array_keys($_GET) as $k) {
if (!isset($all[$k])) $all[$k] = $_GET[$k];
}
$p = '';
foreach (array_keys($all) as $k) $p .= $k . '=' . $all[$k] . '&';
return rtrim($p, '&');
}
}
Page::EventLoad();
?>
name 會出現在 $_POST 中。EventLoad() 掃描 $_POST 鍵名,比對所有使用者定義函數(移除 _click 後綴)。$SYSRunEventName。Page_Load(),再呼叫 $SYSRunEventName() 執行具體事件函數。Comm::GetParam() 保留 GET 參數並合併額外參數,方便分頁、編輯模式保持網址狀態。function_exists、get_defined_functions 反射機制。