前言
從其他語言(Java、C#、Python 等)轉入 PHP,最大的適應挑戰在於其獨特的語法糖、弱型別系統、超全域變數與請求生命週期。本系列文章以「半路出家」開發者視角,記錄 PHP 核心語法精華與避坑指南。第一篇涵蓋程式碼標籤、註解風格、輸出函式差異、變數宣告與基本型別系統。
一、PHP 程式碼標籤
PHP 解析器只處理標籤內的程式碼,標籤外內容原樣輸出(HTML)。
| 標籤樣式 | 範例 | 建議度 | 說明 |
| 標準標籤 | `` | ✅ **強烈推薦** | 所有 PHP 版本支援、XML 相容、IDE 完美識別 |
| 短標籤 | ` echo 'Hello'; ?>` | ❌ 不推薦 | 需 `php.ini` `short_open_tag=On`,XML 衝突,可移植性差 |
| ASP 樣式 | `<% echo 'Hello'; %>` | ❌ 已移除 | PHP 7.0 移除,歷史遺產 |
| Script 標籤 | `` | ❌ 不推薦 | 冗長、無優勢,罕見 |
最佳實踐:純 PHP 檔案**省略結尾 `?>`**,避免非預期空白輸出導致 Header 發送失敗。
二、註解風格
// 單行註解(C++ 風格)
$name = 'PHP'; // 行尾註解
/*
* 多行註解(C 風格)
* 適合區塊說明、函式文檔
*/
$version = '8.3';
# 單行註解(Shell/Perl 風格)
$author = 'Developer';
文檔註解標準 (PHPDoc):
/**
* 計算兩數和
* @param int $a 第一個加數
* @param int $b 第二個加數
* @return int 總和
* @throws InvalidArgumentException 參數非整數時拋出
*/
function sum(int $a, int $b): int {
return $a + $b;
}
三、輸出函式大比拚
| 函式 | 語法 | 回傳值 | 效能 | 特點 |
echo | `echo 'str';` / `echo 'a', 'b';` | 無 (`void`) | 最快 | 語言結構、可多參數逗號分隔、無括號 |
print | `print 'str';` / `print('str');` | 永遠回傳 `1` | 略慢 | 語言結構、單一參數、可用於表達式 |
printf | `printf('格式', $args...)` | 輸出長度 (int) | 最慢 | 函式、格式化輸出、類 C `printf` |
sprintf | `$str = sprintf('格式', $args...)` | 格式化字串 | 同 printf | 不輸出、回傳字串、適合建立字串變數 |
關鍵差異示範
// echo 多參數(無連接開銷)
echo 'Hello', ' ', 'World'; // 快
// print 只能單一參數
print 'Hello World'; // 回傳 1,可用於:$x = print 'test'; // $x = 1
// printf 格式化輸出
printf("價格: $%.2f\n", 12.3424); // 價格: $12.34
// sprintf 產生字串
$formatted = sprintf("$%.2f", 12.3424); // $formatted = '$12.34'
printf("格式化後: %s", $formatted);
引號差異:單引號 vs 雙引號
| 特性 | 單引號 `'...'` | 雙引號 `"..."` |
| 變數解析 | ❌ 不解析 | ✅ 解析變數 |
| 跳脫字元 | 僅 `\'` 和 `\\` | 完整支援 `\n`, `\t`, `\$`, `\"` 等 |
| 效能 | 略快(無解析開銷) | 略慢 |
| 適用場景 | 純字串、不需變數插值 | 需變數插值、跳脫字元 |
$name = 'PHP';
echo 'Hello $name'; // Hello $name
echo "Hello $name"; // Hello PHP
// 複雜變數需用大括號
echo "Hello {$name}World"; // Hello PHPWorld
四、變數系統
核心規則
- 必須以 `$` 開頭:`$var`、`$_POST`、`$this->property`
- 大小寫敏感:`$name` ≠ `$Name` ≠ `$NAME`
- 弱型別(動態型別):變數無固定型別,值決定型別,可隨時改變
- 預設值為 `null`**:未賦值變數直接使用會觸發 Notice(PHP 8.0+ 為 Warning)
標量型別
| 型別 | 範例 | 檢測函式 |
| 整數 | `$age = 25; $hex = 0xFF; $oct = 0755;` | `is_int()` |
| 浮點數 | `$price = 19.99; $sci = 1.2e3;` | `is_float()` / `is_double()` |
| 字串 | `$str = "Hello"; $raw = 'Raw';` | `is_string()` |
| 布林 | `$flag = true; $off = false;` | `is_bool()` |
複合型別
- 陣列:有序映射(鍵值對),支援整數/字串鍵,詳見下篇
- 物件:類別實例
- Callable**:可呼叫型別(函式、閉包、類別方法)
特殊型別
- Resource:外部資源控制代碼(資料庫連線、檔案控制代碼、圖片資源)
- NULL:無值狀態
五、物件導向基礎語法
class MyTest {
// 可視性:public, protected, private
private string $a; // PHP 7.4+ 型別宣告
// 建構子
public function __construct(string $a = '') {
$this->a = $a;
}
// 存取器
public function getA(): string {
return $this->a;
}
public function setA(string $a): void {
$this->a = $a;
}
}
// 實例化
$obj = new MyTest();
$obj->setA('HI~');
echo $obj->getA(); // HI~
// 物件操作符:-> (非 Java 的 .)
// $obj->method() 呼叫方法
// $obj->prop 存取屬性
與 Java 差異快速對照
| 特性 | Java | PHP |
| 方法回傳型別宣告 | 強制 | PHP 7.0+ 可選(建議加上) |
| 物件操作符 | `.` | `->` |
| 變數前綴 | 無 | `$` (永遠需要) |
| 建構子名稱 | 同類別名 | `__construct()` |
| 解構子 | `finalize()` (已淘汰) | `__destruct()` |
六、型別轉換與檢測
強制轉換
$val = '123';
$int = (int)$val; // 123
$float = (float)$val; // 123.0
$bool = (bool)$val; // true (非空字串)
$arr = (array)$val; // ['123']
$obj = (object)$val; // stdClass Object ( [scalar] => '123' )
$str = (string)$val; // '123'
$null = (unset)$val; // null (PHP 7.2+)
自動轉換規則(隱性轉型)
- 字串參與數學運算 → 取前導數字部分:`'10px' + 5` = `15`
- `if`、`while` 條件判斷:`0`、`0.0`、`'0'`、`''`、`[]`、`null`、`false` → `false`;其餘 → `true`
- 字串連接 `.` 會強制轉字串
型別檢測函式
$var = 'hello';
// 取得型別字串
echo gettype($var); // 'string'
// 判斷特定型別
var_dump(is_string($var)); // true
var_dump(is_numeric($var)); // false
// 設定型別(修改變數本身)
$num = '123';
settype($num, 'integer');
var_dump($num); // int(123)
七、變數範圍
| 範圍 | 關鍵字 | 生命週期 | 存取方式 |
| 區域 | (預設) | 函式/區塊執行期間 | 僅限定義區塊內 |
| 全域 | `global $var` | 腳本執行期間 | 函式內需 `global` 宣告 |
| 靜態 | `static $var` | 腳本執行期間 | 函式內保持值跨呼叫 |
| 超全域 | 預定義 | 請求期間 | 任何位置直接存取 |
超全域變數(超級全域陣列)
$_SERVER // 伺服器與執行環境資訊($_SERVER['REQUEST_URI'], $_SERVER['HTTP_USER_AGENT']...)
$_GET // URL 查詢字串參數
$_POST // POST 請求主體參數
$_COOKIE // Cookie 資料
$_FILES // 上傳檔案資訊
$_ENV // 環境變數
$_REQUEST // $_GET + $_POST + $_COOKIE 合併(不建議使用,來源不明確)
$_SESSION // Session 資料(需 session_start())
$GLOBALS // 所有全域變數參考陣列
八、常數定義
// 定義常數(慣例全大寫)
define('APP_NAME', 'My Application');
define('MAX_UPLOAD_SIZE', 10 * 1024 * 1024); // 10MB
// 類別常數(PHP 5.3+)
class Config {
const VERSION = '1.0.0';
const DEBUG = true;
}
// 使用
echo APP_NAME;
echo Config::VERSION;
// 常數 vs 變數
// 常數:無 $、不可變、全域可見、只能定義標量/陣列 (PHP 7+)
九、本篇重點回顧
- 統一使用 `` 標籤,純 PHP 檔省略結尾標籤
- 註解:單行 `//`、`#`,多行 `/* */`,文檔 `/** */`
- 輸出:`echo` 最快多參數,`print` 可用於表達式,`printf/sprintf` 格式化
- 單引號不解析變數(快),雙引號解析變數(方便)
- 變數永遠 `$` 開頭,弱型別動態轉換
- 物件操作符 `->`,建構子 `__construct()`
- 型別轉換:強制 `(type)`、自動隱性轉型、檢測 `is_*/gettype()`
- 超全域變數 `$_GET/$_POST/$_SESSION...` 任何位置可存取
- 常數 `define()` 或 `const`,不可變、無 `$`、全域可見
下一篇將深入探討 PHP 陣列系統——這是 PHP 最強大、最靈活、最獨特的資料結構,被稱為「有靈魂的陣列」。