PHP 歷史包袱導致許多相似功能並存,誤用易引發 Bug。本文針對 6 組高頻混淆點深度解析,附記憶口訣與最佳實踐。
echo vs print| 特性 | echo | print |
|---|---|---|
| 回傳值 | 無 | 永遠回傳 1 |
| 多參數 | 支援 echo 'a', 'b' | 單一參數 |
| 效能 | 略快 (無回傳開銷) | 略慢 |
| 用於表達式 | 不可 | 可 $r = print 'hi'; // $r=1 |
建議:輸出用 echo,需回傳值極少見才用 print。
include vs require| 特性 | include | require |
|---|---|---|
| 條件載入 | 動態判斷 if($a) include 'a.php'; | 無條件,編譯期即解析 |
| 失敗行為 | 發出 Warning,腳本繼續 | 發出 Fatal Error,腳本中止 |
| 效能 | 相同 (Opcode 快取後) | 相同 |
口訣:require = required (必要),缺一不可;include = 可選。
_once 變體require_once 'config.php'; // 同一請求僅載入一次,防重複定義函數/類
include_once 'helper.php';
現代專案配合 Composer 自動載入,極少手寫 include/require。
'' vs null vs 0<?php
var_dump(gettype('')); // string
var_dump(gettype(null)); // NULL
var_dump(gettype(0)); // integer
// 相等比較
'' == null; // true (值相等)
'' === null; // false (型別不同)
0 == ''; // true
0 === ''; // false
鐵律:永遠用 === / !==,除非刻意要型別轉換比較。
!isset() vs empty()<?php
$id = 0;
empty($id); // true (視為「空」)
isset($id); // true (變數存在且非 null)
!isset($id); // false
$undefined; // 未定義
empty($undefined); // true (不報錯)
isset($undefined); // false
關鍵差異:empty(0) === true 會誤判業務合法值 (如 id=0、total=0)。
建議:檢查「是否傳入」用 isset() 或 array_key_exists();檢查「非空值」用自訂函數 is_blank()。
== vs ==='' == null; // true
'' === null; // false
0 == '0'; // true
0 === '0'; // false
[] == false; // true
[] === false; // false
結論:=== 同時比較值與型別,== 觸發複雜型別轉換規則 (易出錯)。「嚴格比較」應為預設習慣。
echorequire_once (或 Composer)=== / !==isset()!is_blank($val) 自訂