原始碼混合 PHP 與 JavaScript,意圖透過 Cookie 控制某段 JS 只執行一次:
<?php
header("Content-type: text/javascript");
if (!haveCookie('cookieName')) {
?>
/* JavaScript 代碼 */
if ('undefined' == typeof document.cookie['cookieName']) {
setCookie('cookieName', 3600);
}
// ... 其它 JS 邏輯
<?php
}
?>
乍看合理,實則 JavaScript 判斷永遠為 true:
if ('undefined' == typeof document.cookie['cookieName']) { ... }
原因: 這段 JS 只有在 PHP 端 !haveCookie('cookieName') 成立時才會輸出到客戶端。也就是說,JS 執行時 Cookie 必定不存在,判斷條件恆真,等同於重複檢查。
<?php
header("Content-type: text/javascript");
if (!haveCookie('cookieName')) {
if (!haveCookie('cookieName')) { // 邏輯重複
setCookie('cookieName');
}
}
?>
一眼即見多餘的巢狀判斷。
if 條件中直接呼叫耗時函數。if 巢狀超過 3 層,應重新審視演算法與流程設計。isset()、empty()、??(Null 合併運算子)簡化條件撰寫。感謝 小馬 同志指正,促成此番反思。