首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Java 程序員快速上手 PHP 核心語法筆記:從強類型到弱類型的思維轉換

     編輯:PHP 相關知識

Java 開發者 30 分鐘掌握 PHP 核心語法差異與陷阱指南

Java 開發者轉 PHP,最大的心智負擔在於**強類型 → 弱類型**、**編譯時檢查 → 運行時檢查**、**單入口框架 → 腳本式執行**。本文以對比表格、最小代碼片段、避坑清單三大維度,助你快速建立 PHP 心智模型,避開 90% 新手坑。

一、語法風格與基礎規則對比

特性JavaPHP關鍵差異
文件後綴.java.phpPHP 可嵌入 HTML
代碼分隔符類/方法<?php ?> / <script language="php"></script> / <? ?>(短標簽) / <% %>(ASP風格)推薦只用 XML 風格 <?php ?>
語句結尾;;一致
註釋// /* */ /** */// # /* */PHP 多 # 腳本風格
變量聲明類型 變量名$變量名(無類型,賦值時確定)PHP 變量**區分大小寫**,$ 開頭
長字符串StringBuilder / 文本塊Heredoc/Nowdoc: <<<EOF ... EOF;PHP 專有語法
常量final staticdefine('NAME', 'value', true/false) / const NAME = 'value'(類內)define 第 3 參數控制大小寫敏感
魔術常量無__FILE__ __LINE__ __FUNCTION__ __CLASS__ __METHOD__ __DIR__ __NAMESPACE__運行時動態解析

二、變量作用域:全局 vs 局部 vs 靜態

<?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 字段)。
  • 超全局變量(自動全局可訪問,無需 global):$GLOBALS、$_SERVER、$_GET、$_POST、$_REQUEST、$_FILES、$_ENV、$_COOKIE、$_SESSION。

三、數組:PHP 的「萬能容器」

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);      // 映射
?>

四、面向對象:相似但關鍵不同

特性JavaPHP
類聲明class Name {}class Name {}
屬性修飾符private/protected/publicprivate/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()
命名空間packagenamespace (PHP 5.3+)
自動加載ClassLoaderspl_autoload_register / Composer PSR-4

關鍵操作符

  • :: 作用域解析符(靜態成員、常量、晚期靜態綁定)
  • -> 對象成員訪問
  • => 數組鍵值分隔
  • =& 引用賦值(別名)
  • = 值賦值(複製)

五、數據庫操作:從 JDBC 到 PDO

**棄用 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 vs include

語句失敗行為加載時機用途
requireE_COMPILE_ERROR 停止執行編譯期(靜態)核心依賴、配置文件
includeE_WARNING 繼續執行運行期(動態)模板、可選模塊
require_once同 require,僅加載一次編譯期防止重複定義
include_once同 include,僅加載一次運行期模板片段

七、輸出函數:echo vs print vs printf vs var_dump

  • echo:語言構造,**無返回值**、可多參數 echo 'a','b'、速度最快。
  • print:語言構造,**恒返回 1**、單參數、可用於表達式 $a = print 'hi';。
  • printf/sprintf:C 風格格式化,**printf 輸出、sprintf 返回字符串**。
  • var_dump:調試神器,**輸出類型+長度+值**,支持遞歸、引用檢測。
  • print_r:易讀格式輸出數組/對象,**第二參數 true 返回字符串**。

八、Java 開發者最易踩的 10 大坑

  1. == vs ===:== 類型轉換比較('1' == 1 → true),=== 全等(類型+值)。**永遠優先用 ===**。
  2. 變量未定義不報錯:echo $undef; 僅 Notice,**生產環境關閉 display_errors 但開啟 log_errors**。
  3. 數組鍵不存在不報錯:$arr['missing'] 返回 null + Notice,用 isset() 或 array_key_exists() 判斷。
  4. foreach 遍歷引用陷阱:
    foreach ($arr as &$v) { $v *= 2; } unset($v); // 必須 unset 釋放引用,否則後續循環污染
  5. 函數參數默認按值傳遞:大數組/對象需显式 function(&$arr) 或 PHP 5+ 對象默認引用行為。
  6. 字符串拼接用 . 而非 +:'a' . 'b',+ 為數學加法(字符串轉數字)。
  7. 類加載非即時:需 spl_autoload_register 或 Composer autoload.php,否則 new Class 報錯。
  8. 錯誤 vs 異常:PHP 7+ Error 繼承 Throwable,**catch (Throwable $e) 才能捕獲所有**。
  9. Session 預設文件存儲:分佈式必須改 Redis/Database handler,session_set_save_handler 或框架配置。

九、推薦學習路徑

  1. 語法速成(本文)→ 2 小時
  2. Composer + PSR-4 + 命名空間 → 1 小時
  3. PDO + 預處理 + 事務 → 1 小時
  4. 主流框架(Laravel / Symfony / ThinkPHP)任選一精通 → 2 週
  5. Composer 生態:PHPUnit、PHPStan、Psalm、Rector、PHP-CS-Fixer → 持續精進

PHP 不再是當年「模板引擎」,現代 PHP(7.4+)擁有類型聲明、屬性、JIT、Fiber、Enum、Readonly 屬性等現代特性,配合 Composer 豐富生態,完全能勝任企業級應用。祝你快速完成思遷移!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved