Java 開發者轉 PHP,最大的心智負擔在於**強類型 → 弱類型**、**編譯時檢查 → 運行時檢查**、**單入口框架 → 腳本式執行**。本文以對比表格、最小代碼片段、避坑清單三大維度,助你快速建立 PHP 心智模型,避開 90% 新手坑。
| 特性 | Java | PHP | 關鍵差異 |
|---|---|---|---|
| 文件後綴 | .java | .php | PHP 可嵌入 HTML |
| 代碼分隔符 | 類/方法 | <?php ?> / <script language="php"></script> / <? ?>(短標簽) / <% %>(ASP風格) | 推薦只用 XML 風格 <?php ?> |
| 語句結尾 | ; | ; | 一致 |
| 註釋 | // /* */ /** */ | // # /* */ | PHP 多 # 腳本風格 |
| 變量聲明 | 類型 變量名 | $變量名(無類型,賦值時確定) | PHP 變量**區分大小寫**,$ 開頭 |
| 長字符串 | StringBuilder / 文本塊 | Heredoc/Nowdoc: <<<EOF ... EOF; | PHP 專有語法 |
| 常量 | final static | define('NAME', 'value', true/false) / const NAME = 'value'(類內) | define 第 3 參數控制大小寫敏感 |
| 魔術常量 | 無 | __FILE__ __LINE__ __FUNCTION__ __CLASS__ __METHOD__ __DIR__ __NAMESPACE__ | 運行時動態解析 |
<?php
$globalVar = 'I am global';
function testScope() {
$localVar = 'I am local'; // 局部變量
global $globalVar; // 引用全局變量(方式1)
$GLOBALS['globalVar'] = 'modified'; // 方式2:超全局數組
static $staticVar = 0; // 靜態變量:函數調用間保持值
$staticVar++;
echo "static: $staticVar\n";
}
testScope(); // static: 1
testScope(); // static: 2
testScope(); // static: 3
?>
global $var 或 $GLOBALS['var']。static 讓局部變量在調用間**保持狀態**(類似 Java 類的 static 字段)。$GLOBALS、$_SERVER、$_GET、$_POST、$_REQUEST、$_FILES、$_ENV、$_COOKIE、$_SESSION。PHP 數組 = Java 的 List + Map + Set,鍵可為整數或字符串,值可為任意類型。
<?php
// 定義
$arr = ['a' => 1, 'b' => 2]; // 關聯數組 (Map)
$list = [10, 20, 30]; // 索引數組 (List)
$mixed = [0 => 'zero', 'key' => 'value']; // 混合
// 遍歷(推薦 foreach)
foreach ($arr as $key => $val) { /* ... */ }
foreach ($list as $val) { /* ... */ }
// 常用函數
count($arr); // 長度
array_keys($arr); // 所有鍵
array_values($arr); // 所有值(重建索引)
in_array($val, $arr); // 值存在性
array_merge($a, $b); // 合併
array_filter($arr, fn($v) => $v > 1); // 過濾
array_map(fn($v) => $v*2, $arr); // 映射
?>
| 特性 | Java | PHP |
|---|---|---|
| 類聲明 | class Name {} | class Name {} |
| 屬性修飾符 | private/protected/public | private/protected/public / var(舊版兼容,等同 public) |
| 方法修飾符 | 同上 + static/final/abstract | 同上 + final/abstract |
| 構造函數 | ClassName() | __construct() |
| 析構函數 | finalize() (GC不保證) | __destruct() (引用計數0時確定調用) |
| 實例化 | new Class() | new Class() |
| 成員訪問 | obj.field / obj.method() | $obj->field / $obj->method() |
| 靜態訪問 | Class.field / Class.method() | Class::$field / Class::method() |
| 命名空間 | package | namespace (PHP 5.3+) |
| 自動加載 | ClassLoader | spl_autoload_register / Composer PSR-4 |
:: 作用域解析符(靜態成員、常量、晚期靜態綁定)-> 對象成員訪問=> 數組鍵值分隔=& 引用賦值(別名)= 值賦值(複製)**棄用 mysql_* 函數(PHP 7.0 移除)**,統一使用 PDO(PHP Data Objects),類似 JDBC 接口,支持多種數據庫、預處理語句、事務。
<?php
// 連接(類似 DriverManager.getConnection)
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4';
$pdo = new PDO($dsn, 'root', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 拋出異常
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 返回關聯數組
PDO::ATTR_EMULATE_PREPARES => false, // 使用真實預處理
]);
// 查詢
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$userId]);
$user = $stmt->fetch(); // 單行
$users = $stmt->fetchAll(); // 所有行
// 寫入(事務)
$pdo->beginTransaction();
try {
$pdo->prepare('INSERT INTO users(name,email) VALUES(?,?)')->execute(['Tom', 'tom@example.com']);
$pdo->prepare('UPDATE stats SET cnt = cnt + 1')->execute();
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
?>
| 語句 | 失敗行為 | 加載時機 | 用途 |
|---|---|---|---|
| require | E_COMPILE_ERROR 停止執行 | 編譯期(靜態) | 核心依賴、配置文件 |
| include | E_WARNING 繼續執行 | 運行期(動態) | 模板、可選模塊 |
| require_once | 同 require,僅加載一次 | 編譯期 | 防止重複定義 |
| include_once | 同 include,僅加載一次 | 運行期 | 模板片段 |
echo:語言構造,**無返回值**、可多參數 echo 'a','b'、速度最快。print:語言構造,**恒返回 1**、單參數、可用於表達式 $a = print 'hi';。printf/sprintf:C 風格格式化,**printf 輸出、sprintf 返回字符串**。var_dump:調試神器,**輸出類型+長度+值**,支持遞歸、引用檢測。print_r:易讀格式輸出數組/對象,**第二參數 true 返回字符串**。== 類型轉換比較('1' == 1 → true),=== 全等(類型+值)。**永遠優先用 ===**。echo $undef; 僅 Notice,**生產環境關閉 display_errors 但開啟 log_errors**。$arr['missing'] 返回 null + Notice,用 isset() 或 array_key_exists() 判斷。foreach ($arr as &$v) { $v *= 2; } unset($v); // 必須 unset 釋放引用,否則後續循環污染
function(&$arr) 或 PHP 5+ 對象默認引用行為。'a' . 'b',+ 為數學加法(字符串轉數字)。spl_autoload_register 或 Composer autoload.php,否則 new Class 報錯。Error 繼承 Throwable,**catch (Throwable $e) 才能捕獲所有**。session_set_save_handler 或框架配置。PHP 不再是當年「模板引擎」,現代 PHP(7.4+)擁有類型聲明、屬性、JIT、Fiber、Enum、Readonly 屬性等現代特性,配合 Composer 豐富生態,完全能勝任企業級應用。祝你快速完成思遷移!