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

PHP 核心知識兩千行筆記精華版

     編輯:PHP 相關知識

PHP 核心知識兩千行筆記精華版

整理自實戰開發與面試高頻考點,涵蓋語法基礎、型別系統、流程控制、函數進階、物件導向、資料庫操作、錯誤異常處理、安全防護、效能優化等核心領域。適合進階開發者快速查閱與複習。

一、命名規範與語言結構

  • 類別/介面:PascalCase (如 UserService);常量:UPPER_SNAKE;變數/方法:camelCase;私有成員:_prefix;介面:I_ 前綴。
  • 語言結構 (非函數,不可作為可變函數):echo, print, isset, empty, unset, list, array, eval, exit, die。
  • 預定義常量:PHP_VERSION, PHP_OS, PHP_SAPI, PHP_EOL, DIRECTORY_SEPARATOR, PATH_SEPARATOR, PHP_INT_MAX, M_PI, M_E。

二、型別系統與轉換

分類型別檢測函數強制轉換
純量Integeris_int / is_integer / is_long(int), intval()
Floatis_float / is_double / is_real(float), floatval()
Stringis_string(string), strval()
Booleanis_bool(bool), boolval()
NULLis_null(unset)
Resourceis_resource—
Callableis_callable—
Iterable (PHP 7.1+)is_iterable—
複合Arrayis_array(array)
複合Objectis_object(object)
  • 浮點數不可直接比較大小,需用 abs($a-$b) < EPSILON 或 bccomp。
  • gettype() 取得型別;settype() 修改型別 (參考傳遞)。
  • var_dump() 顯示型別與值;var_export() 回傳合法 PHP 代碼字串;print_r() 易讀輸出。

三、變數進階

  • 可變變數:$$var;可變函數:$func();可變屬性/方法:$obj->$prop、$obj->$method()。
  • 超全域變數:$GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST, $_ENV。
  • $GLOBALS 為所有全域變數的關聯陣列,函數內修改 $GLOBALS['x'] 即修改全域 $x。
  • global $x 建立別名 (引用),不如 $GLOBALS 直觀,不建議濫用。
  • 靜態變數 static $x = 1;:函數內保持狀態,僅初始化一次,生命週期贯穿腳本。

四、字串與編碼

  • 單引號:不解析變數、轉義僅 \' \\,效能略高。
  • 雙引號:解析變數、支援完整轉義序列 (\n, \r, \t, \$, \"、八進制 \123、十六進制 \x41)。
  • Heredoc (<<<EOF) 等同雙引號;Nowdoc (<<<'EOF') 等同單引號。
  • 多位元組字串:必須用 mbstring 擴展函數 (mb_strlen, mb_substr, mb_strpos, mb_strtolower...);內部編碼建議統一 mb_internal_encoding('UTF-8')。
  • iconv 轉換編碼:iconv('GBK', 'UTF-8//IGNORE', $str)。

五、陣列操作精選

分類函數說明
建立/合併array_merge合併,字串鍵後覆蓋前,數字鍵重新索引
array_merge_recursive遞歸合併,相同鍵值變為陣列
array_combine一陣列作鍵,一陣列作值建立新陣列
array_fill / array_pad填充固定值 / 擴展至指定長度
搜尋/過濾in_array / array_search值存在性 / 回傳鍵名 (嚴格模式第3參數 true)
array_key_exists / isset($arr[$k])鍵存在性 (前者包含 null 值)
array_filter回呼過濾,保留鍵不變
array_map回呼映射值,可多陣列平行處理
堆疊/佇列array_push / array_pop陣列尾部入棧/出棧 (重新索引)
array_unshift / array_shift陣列頭部入隊/出隊 (重新索引)
排序sort/rsort, asort/arsort, ksort/krsort, usort/uksort/uasort, natsort/natcasesort, shuffle
差集/交集array_diff/array_diff_assoc/array_diff_key, array_intersect/array_intersect_assoc/array_intersect_key
  • foreach 遍歷的是陣列 複製品,修改 $value 不影響原陣列,除非用 &$value 參考;循環體對原陣列操作 (增刪) 生效但不影響遍歷指標。
  • 指標函數:current, key, next, prev, reset, end, each;each 回傳 [1=>value, 0=>key, 'key'=>key, 'value'=>value]。

六、函數進階

  • 參數:預設值 (必須在非預設參數右側)、引用傳遞 (&$arg)、可變參數 (func_get_args())、型別宣告 (function foo(array $arr, MyClass $obj))。
  • 返回:值傳遞 (預設)、引用返回 (function &foo() 需配合 $x =& foo())、return 立即結束函數。
  • 作用域:全域 vs 局部;static 靜態局部變數;use 閉包引入外部變數 (值/引用)。
  • 匿名函數/閉包:$fn = function($x) use (&$external) { ... }; 實現 Closure 類別物件,可當回呼、陣列元素、返回值。
  • 遞歸 vs 迭代:遞歸代碼簡潔但有堆疊溢位風險,深度大時改迭代。

七、物件導向 (OOP) 核心

特性關鍵字/語法重點
封裝public / protected / private屬性預設 private,提供 getter/setter
繼承extends (單繼承)子類覆寫父類方法,parent::method() 調用父實作
多型介面 (implements) / 抽象類 (abstract)介面多實現,規範契約;抽象類可含實作
靜態成員static屬於類,Class::$prop、Class::method(),$this 不可用
晚期靜態綁定static::執行期解析,static::method() 代表調用類而非定義類
魔術方法__construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __clone, __debugInfo
單例模式私有構造、靜態實例、靜態 getInstance、私有 __clone
自動載入spl_autoload_registerPSR-4 標準,Composer 自動生成
序列化serialize / unserialize資源型別不可序列化;__sleep/__wakeup 控制過程
反射ReflectionClass/Method/Property運行時檢測結構、代理執行、註解解析
Traitstrait / use橫向復用,解決單繼承限制,優先級: 當前類 > Trait > 父類

八、資料庫操作 (PDO 最佳實踐)

$dsn = 'mysql:host=127.0.0.1;dbname=test;charset=utf8mb4';
$pdo = new PDO($dsn, 'user', 'pass', [
    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 email = ? AND status = ?');
$stmt->execute([$email, 1]);
$user = $stmt->fetch();

// 事務
$pdo->beginTransaction();
try {
    $pdo->exec('INSERT ...');
    $pdo->exec('UPDATE ...');
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    throw $e;
}

九、錯誤與異常處理

  • 錯誤等級:E_ERROR, E_WARNING, E_NOTICE, E_DEPRECATED, E_STRICT 等;error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT)。
  • 生產環境:display_errors=Off, log_errors=On, error_log=/var/log/php/error.log。
  • 自定義錯誤處理器:set_error_handler(function($level, $msg, $file, $line) { ... })。
  • 異常:try { } catch (SpecificException $e) { } catch (Exception $e) { } finally { };自定義異常繼承 Exception;set_exception_handler 捕獲未處理異常。
  • Throwable (PHP 7+) 為 Error 與 Exception 共同介面,可 catch (Throwable $e) 捕獲所有。

十、安全防護清單

  1. SQL 注入:全域使用 PDO 預處理,嚴禁拼接 SQL。
  2. XSS:輸出到 HTML 用 htmlspecialchars($str, ENT_QUOTES, 'UTF-8');輸出到 JS 用 json_encode;引入 HTMLPurifier 過濾富文本。
  3. CSRF:表單隱藏 _token,驗證 $_SESSION['_token'] === $_POST['_token'];同站 Cookie SameSite=Strict/Lax。
  4. 檔案上傳:驗證 MIME (finfo_file)、副檔名、大小;儲存路徑非 Web 可訪問;重命名亂數檔名;Nginx 禁用上傳目錄 PHP 執行。
  5. 密碼儲存:password_hash($pwd, PASSWORD_BCRYPT)、password_verify($pwd, $hash);禁止 MD5/SHA1。
  6. Session 安全:session.use_strict_mode=1, session.cookie_httponly=1, session.cookie_secure=1 (HTTPS), session.cookie_samesite=Lax;定期 session_regenerate_id(true)。
  7. 命令注入:避免 exec, shell_exec, system, passthru;若必須用,參數經 escapeshellarg、escapeshellcmd。

十一、效能優化關鍵點

  • 啟用 OPcache (PHP 內建):opcache.enable=1, opcache.memory_consumption=256, opcache.max_accelerated_files=20000, opcache.validate_timestamps=0 (生產)。
  • 使用 Composer Classmap/PSR-4 自動載入,避免大量 require_once。
  • 資料庫:索引優化、避免 SELECT *、分頁用 WHERE id > last_id LIMIT n 而非 OFFSET、讀寫分離、Redis 快取熱點資料。
  • HTTP:Nginx gzip、expires 快取靜態資源、CDN、Keep-Alive、HTTP/2。
  • Profiling:xhprof、Blackfire、Tideways 定位熱點函數。

十二、常用超全域變數 $_SERVER 速查

鍵名含義範例
REQUEST_METHOD請求方法GET, POST
REQUEST_URI完整請求 URI/api/user?id=1
QUERY_STRING查詢字串id=1&name=test
HTTP_HOSTHost 標頭example.com
HTTP_USER_AGENT客戶端 UAMozilla/5.0...
HTTP_REFERER來源頁面https://google.com/
REMOTE_ADDR客戶端 IP192.168.1.1
SERVER_ADDR伺服器 IP10.0.0.5
SCRIPT_FILENAME當前腳本絕對路徑/var/www/html/index.php
DOCUMENT_ROOT網站根目錄/var/www/html
PHP_SELF當前腳本相對路徑/index.php
REQUEST_TIME請求開始時間戳1700000000

十三、日期時間處理

  • time() 秒級時間戳;microtime(true) 微秒級浮點數。
  • date('Y-m-d H:i:s') 格式化;DateTime 物件導向介面 (支援時區、大於 2038 年)。
  • strtotime('+1 day') 相對時間解析;DateTime::createFromFormat 解析指定格式。
  • 時區:date_default_timezone_set('Asia/Taipei') 或 php.ini: date.timezone。

十四、Composer 與現代開發流

  • composer require vendor/package 安裝套件;composer dump-autoload -o 生成優化自動載入。
  • composer.json 定義依賴、腳本、自動載入規則 (PSR-4)。
  • 常用套件:monolog/monolog (日誌)、vlucas/phpdotenv (環境變數)、firebase/php-jwt (JWT)、ramsey/uuid (UUID)、phpoffice/phpspreadsheet (Excel)。

十五、命令列 (CLI) 模式

php -r 'echo "Hello";'          # 單行代碼
php -l file.php                 # 語法檢查
php -i                          # phpinfo
php -m                          # 已載入模組
php script.php arg1 arg2        # 執行腳本,$argv[0]=腳本名,$argv[1]=arg1,$argc=參數數
# 只在 CLI 模式可用:STDIN, STDOUT, STDERR 常數資源

筆記持續更新中,歡迎星標收藏。配套 MySQL 筆記:一千行 MySQL 學習筆記

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