PHP 繼承了 Perl 強大的正則表達式與 C 語言的高效能,擁有靈活的變數系統。許多開發者只會基本語法,卻忽略了這三項核心技能的深度應用。本文系統梳理進階變數/陣列操作、正則實戰模式、模板引擎原理與實作,助你邁向 PHP 專家之路。
<?php
$data = ['a' => 'data1', 'b' => 'data2', 'c' => 'data3'];
// list() + each() - 經典寫法,each() 已棄用 (PHP 7.2+)
reset($data);
while (list($key, $val) = each($data)) {
echo "$key => $val\n";
}
// foreach - 現代標準,支援引用修改原值
foreach ($data as $key => $val) {
echo "$key => $val\n";
}
// array_walk() - 函式式處理,適合複雜邏輯封裝
array_walk($data, function($val, $key) {
echo "$key => $val\n";
});
<?php
// 變數變數 $$
$var = 'this is a var';
$varName = 'var';
echo $$varName; // 輸出:this is a var
// 函式變數
function greet($name) { echo "Hello, $name!"; }
$funcName = 'greet';
$funcName('World'); // 輸出:Hello, World!
// 引用傳遞:模擬指標行為
function addRef(&$num) { $num++; }
$n = 5;
addRef($n);
echo $n; // 6 (原值被修改)
function addVal($num) { $num++; }
$n = 5;
addVal($n);
echo $n; // 5 (傳值不影響原值)
| 函式 | 用途 | 範例 |
|---|---|---|
| array_map | 對每個元素套用函式 | array_map('trim', $arr) |
| array_filter | 過濾元素 | array_filter($arr, fn($v)=>$v>0) |
| array_reduce | 歸約為單一值 | array_reduce($arr, fn($c,$v)=>$c+$v, 0) |
| array_column | 提取欄位 (PHP 5.5+) | array_column($users, 'name') |
| array_keys/values | 取得鍵/值陣列 | array_keys($assoc) |
| extract | 陣列變數化 | extract(['a'=>1]); echo $a; |
| compact | 變數陣列化 | compact('a','b') |
PHP 採用 PCRE (Perl Compatible Regular Expressions) 引擎,功能強大且效能優異。
| 元字元 | 含義 | 範例 |
|---|---|---|
^ | 字串開頭 | ^http |
$ | 字串結尾 | html$ |
. | 任意單字元 (除換行) | a.c 匹配 abc, axc |
\d | 數字 [0-9] | \d{3}-\d{4} |
\w | 字母數字底線 | \w+@\w+\.\w+ |
\s | 空白字元 | \s+ |
[] | 字元類別 | [aeiou] |
() | 分組/捕獲 | (\d{4})-(\d{2}) |
| | 或 | cat|dog |
* + ? {n,m} | 量詞 | \d+ 一個以上數字 |
<?php
// 1. 手機號碼 (台灣制式)
$mobile = '/^09\d{8}$/';
// 2. Email (RFC 5322 簡化版)
$email = '/^[\w.+-]+@[\w-]+\.[\w.-]+$/';
// 3. URL
$url = '/^https?:\/\/[\w.-]+\.[a-z]{2,}(\/\S*)?$/i';
// 4. 日期 YYYY-MM-DD
$date = '/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/';
// 5. 中文字 (含標點)
$chinese = '/^[\x{4e00}-\x{9fa5}]+$/u'; // 需 u 修飾符
// 實戰:驗證北京電話 010-XXXXXXXX
$pattern = '^010\d{8}$';
$phone = '01080718828';
if (preg_match($pattern, $phone)) {
echo "北京電話";
}
preg_match():單次匹配,回傳 0/1,效能最好preg_match_all():全域匹配,回傳所有捕獲組preg_replace():搜尋替換,支援回呼函式preg_split():正則分割字串preg_quote():轉義特殊字元,動態建構模式必用模板引擎核心:將業務邏輯 (PHP) 與表現邏輯 (HTML) 分離,實現設計師與程式設計師平行開發。
<?php
// 極簡模板引擎示範
class SimpleTemplate {
private $vars = [];
private $template;
public function assign($key, $val) { $this->vars[$key] = $val; }
public function load($file) { $this->template = file_get_contents($file); }
public function render() {
$output = $this->template;
// 1. 變數替換 {$var}
$output = preg_replace_callback('/\{\$(\w+)\}/', function($m) {
return isset($this->vars[$m[1]]) ? $this->vars[$m[1]] : '';
}, $output);
// 2. 迴圈 {loop $arr}...{/loop}
$output = preg_replace_callback('/\{loop\s+\$(\w+)\}(.*?)\{\/loop\}/s', function($m) {
$arr = $this->vars[$m[1]] ?? [];
$itemTpl = $m[2];
$result = '';
foreach ($arr as $item) {
$row = $itemTpl;
foreach ($item as $k => $v) {
$row = str_replace("{\$item.$k}", $v, $row);
}
$result .= $row;
}
return $result;
}, $output);
return $output;
}
}
// 使用
$tpl = new SimpleTemplate();
$tpl->assign('title', '我的部落格');
$tpl->assign('posts', [
['title' => '第一篇', 'date' => '2024-01-01'],
['title' => '第二篇', 'date' => '2024-01-02'],
]);
$tpl->load('template.html');
echo $tpl->render();
<html><head><title>{$title}</title></head><body>
<h1>{$title}</h1>
{loop $posts}
<article>
<h2>{$item.title}</h2>
<time>{$item.date}</time>
</article>
{/loop}
</body></html>
| 引擎 | 特色 | 學習曲線 | 效能 |
|---|---|---|---|
| Smarty | 老牌、功能豐富、快取完善 | 中 | 良 (編譯快取) |
| Twig | Symfony 內建、語法優雅、安全 | 低 | 優 (編譯為 PHP) |
| Blade | Laravel 內建、原生 PHP 語法、繼承區塊 | 低 | 優 |
| Plates | 原生 PHP、零依賴、輕量 | 極低 | 極優 |
| Lathe | 編譯為 PHP、型別安全、現代 | 中 | 優 |
preg_match,複雜解析用 preg_replace_callback。這三項技能是 PHP 開發者從「會寫程式」進階到「設計系統」的關鍵基石。