<?php
$a = 1; $b = 2;
$t = array(
array('a', 'string', $field['a']),
if ($a == $b) { array('b', '1') } // ❌ 語法錯誤:陣列定義中不能放語句
);
print_r($t);
報錯:Parse error: syntax error, unexpected 'if' (T_IF)。PHP 陣列字面量 array(...) / [...] 內部只能包含**表達式**,if 是語句,不可用。
$t = [
['a', 'string', $field['a']],
$a == $b ? ['b', '1'] : ['b', '2'] // 表達式,返回陣列
];
$cond = $a == $b ? ['b', '1'] : null;
$t = [
['a', 'string', $field['a']],
$cond ?? ['b', '2']
];
$base = [
['a', 'string', $field['a']],
];
$extra = [];
if ($a == $b) {
$extra[] = ['b', '1'];
} else {
$extra[] = ['b', '2'];
}
// 甚至可以多條件
if ($someOtherCondition) {
$extra[] = ['c', '3'];
}
$t = array_merge($base, $extra);
$t = [
['a', 'string', $field['a']],
...($a == $b ? [['b', '1']] : [['b', '2']]), // 展開陣列元素
...($showC ? [['c', '3']] : []),
];
作者說「開發代碼沒及時清理緩存。。。。悲劇就是從這裡開始」。實際上 **PHP 陣列定義語法錯誤屬於編譯期錯誤,與運行時緩存 (OPcache/模板緩存) 無關**。只要代碼修正並重新請求 (OPcache 會自動檢測文件修改時間失效),即可生效。別把語法錯誤甩鍋給緩存。