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

PHP 核心知識大全:從語法基礎到進階特性的 2000 行實戰筆記

     編輯:PHP 綜合知識

前言

本文整理自超過 2000 行的 PHP 學習筆記,涵蓋命名規範、資料類型、流程控制、函數進階、物件導向、資料庫操作、錯誤處理、安全防護、效能優化等核心知識點,適合作為速查手冊與面試複習資料。

目錄導覽

  1. 命名規範與語言結構
  2. 資料類型與轉換
  3. 變數、常數與超全域變數
  4. 流程控制與替代語法
  5. 函數進階:參數、返回值、閉包
  6. 陣列操作完全指南
  7. 物件導向:類別、繼承、介面、Traits
  8. 資料庫操作:MySQLi 與 PDO
  9. 安全:SQL 注入、XSS、CSRF 防護
  10. 錯誤與異常處理
  11. 效能:快取、OPcache、併發調優
  12. CLI 模式與腳本編寫
  13. 常用擴充套件與工具

1. 命名規範與語言結構

類型慣例範例
類別/介面PascalCaseUserService, LoggerInterface
方法/函數camelCasegetUserById()
常數UPPER_SNAKE_CASEMAX_RETRY_COUNT
變數/屬性snake_case$user_name, private $_cache
檔案lowercase_snake.phpuser_service.php

語言結構(非函數,不可作為回呼):echo, print, isset(), empty(), unset(), list(), array(), eval(), exit(), die()。

2. 資料類型與轉換

標量類型

  • 整數:32 位系統範圍 -2147483648 ~ 2147483647,PHP_INT_MAX, PHP_INT_SIZE。
  • 浮點數:不可直接比較大小,因精度問題。最大值 ~1.8E308,精度約 14 位。
  • 字串:
    • 單引號:僅轉義 \' 和 \\
    • 雙引號:解析變數、支援 \n, \r, \t, \xHH, \OOO
    • Heredoc (<<<ID) 等同雙引號;Nowdoc (<<<'ID') 等同單引號
  • 布林:false 值:0, 0.0, '', '0', [], null, SimpleXML 空節點。

進制轉換

decbin($n)   // 10→2
bindec($s)   // 2→10
dechex($n)   // 10→16
hexdec($s)   // 16→10
decoct($n)   // 10→8
octdec($s)   // 8→10
base_convert($num, $from, $to) // 任意進制互轉

類型判斷與強制轉換

gettype($var)           // 取得類型字串
settype($var, 'int')    // 就地轉換
is_int($var)            // 判斷
(int)$var               // 強制轉換
intval($var)            // 函式轉換

3. 變數、常數與超全域變數

變數生命週期與作用域

  • 全域變數:腳本結束銷毀;函數內需 global $var 或 $GLOBALS['var'] 存取
  • 區域變數:函數結束銷毀
  • 靜態變數:static $v = 1; 僅初始化一次,跨呼叫保持值
  • 超全域陣列:$GLOBALS, $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, $_SESSION, $_REQUEST, $_ENV

常數定義

define('NAME', 'value', true); // 第三參數 true=不區分大小寫
const NAME = 'value';          // 類常數、命名空間常數,區分大小寫
constant('NAME')               // 動態取得常數值

4. 流程控制與替代語法

// if 替代語法(嵌入 HTML 適用)
if ($cond): 
  // ...
elseif ($cond2):
  // ...
else:
  // ...
endif;

// while/for/foreach/switch 同理
while ($cond): endwhile;
foreach ($arr as $v): endforeach;
switch ($x): case 1: break; default: break; endswitch;
  • goto (PHP 5.3+):同檔案同作用域跳轉,可跳出迴圈/switch,不可進入函數/迴圈內部。
  • declare(ticks=1) { ... }:註冊 tick 回呼(信號處理、效能分析)。

5. 函數進階

參數機制

  • 預設值:function foo($a = 1, $b = 'x'),預設值必須為常數表達式,不可為變數。
  • 引用傳遞:function &foo(&$bar),呼叫時 $x =& foo($y)。
  • 可變參數:function sum(...$nums) (PHP 5.6+) 或 func_get_args()、func_num_args()。
  • 型別宣告:function add(int $a, int $b): int (PHP 7+),declare(strict_types=1) 啟用嚴格模式。

匿名函數與閉包

$fn = function($x) use ($external) { return $x + $external; };
$fn2 = function() use (&$ref) { $ref++; }; // 以引用捕捉外部變數形成閉包

// 閉包綁定
$bound = $fn->bindTo($obj, 'ClassName'); // 指定 $this 與作用域
$bound();

遞迴與迭代

迭代效率優於遞迴;遞迴需明確出口條件。PHP 無尾呼叫優化,深度遞迴易導致堆疊溢位。

6. 陣列操作完全指南

建立與存取

$a = [1, 2, 3];           // 短陣列語法 (PHP 5.4+)
$b = ['k' => 'v', 1 => 2]; // 混合鍵
$c = array_fill(0, 5, 'x'); // ['x','x','x','x','x']

指標操作

current($arr), next($arr), prev($arr), end($arr), reset($arr)
each($arr) // 回傳 [1=>value, 'value'=>value, 0=>key, 'key'=>key] 並前進指標

遍歷

foreach ($arr as $k => &$v) { $v *= 2; } // 參考修改原陣列
foreach ($arr as $k => $v) { /* 唯讀 */ }

常用函數分類速查

分類函數
統計count, array_count_values, array_sum, array_product
鍵值提取array_keys, array_values, array_flip
合併/分割array_merge, array_merge_recursive, array_slice, array_chunk, array_splice
搜尋/過濾in_array, array_search, array_key_exists, array_filter, array_diff*, array_intersect*
排序sort, rsort, asort, arsort, ksort, krsort, usort, uksort, uasort, natsort, shuffle
堆疊/佇列array_push, array_pop, array_unshift, array_shift
字串化implode, explode, join
映射/遍歷array_map, array_walk, array_reduce
隨機/填充array_rand, array_fill, array_pad

7. 物件導向核心

類別結構

class User extends BaseModel implements LoggerAware {
    use Timestampable; // Trait

    const STATUS_ACTIVE = 1;
    public $name;
    protected $email;
    private $_password;

    public static $count = 0;

    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }

    final public function getId() { return $this->id; } // 禁止覆寫

    abstract protected function validate(); // 抽象方法

    public function __clone() { /* 深拷貝邏輯 */ }
    public function __sleep() { return ['name', 'email']; }
    public function __wakeup() { $this->connect(); }
}

存取控制

  • public:任意存取
  • protected:類別本身與繼承鏈
  • private:僅類別本身(不被繼承)

靜態延遲綁定

class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } }
class B extends A { public static function who() { echo __CLASS__; } }
B::test(); // 輸出 A(self 綁定定義時類別)
// 改用 static::who() 則輸出 B(執行時類別)

魔術方法速查

方法觸發時機
__construct實例化 new Class()
__destruct物件銷毀/腳本結束
__call呼叫不可存取的實例方法
__callStatic呼叫不可存取的靜態方法
__get/__set/__isset/__unset存取不可存取的屬性
__sleep/__wakeup序列化/反序列化
__toString物件作為字串使用
__invoke物件當作函數呼叫 $obj()
__clone克隆 clone $obj
__set_statevar_export() 匯出
__debugInfovar_dump() 輸出

介面與抽象類別

  • 介面:interface Foo { public function bar(); },方法隱含 public,可定義常數,支援多重實作 implements A, B 及介面繼承 extends。
  • 抽象類別:abstract class Base { abstract protected function do(); },不可實例化,子類別必須實作所有抽象方法,可包含具體方法。

單例模式

class DB {
    private static $instance = null;
    private function __construct() {}
    private function __clone() {}
    public static function getInstance() {
        if (!self::$instance instanceof self) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

8. 資料庫操作

MySQLi (面向物件)

$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$mysqli->set_charset('utf8mb4');

$stmt = $mysqli->prepare('SELECT * FROM users WHERE email = ?');
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) { /* ... */ }
$stmt->close();

PDO (資料庫抽象層)

$pdo = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', '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 = ?');
$stmt->execute([$email]);
$users = $stmt->fetchAll();

預處理防注入原則

  1. 永不拼接 SQL 字串
  2. 所有動態值使用參數綁定 (? 或 :name)
  3. 識別字(表名、欄位名)不可參數化,需白名單驗證

9. 安全防護

SQL Injection

使用 PDO/MySQLi 預處理;舊代碼必須用 mysqli_real_escape_string();關閉 magic_quotes_gpc。

XSS (跨站腳本)

// 輸出編碼
htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
// 富文本用 HTMLPurifier

CSRF (跨站請求偽造)

  • 表單隱藏欄位攜帶一次性 Token
  • 驗證 $_SESSION['csrf_token'] === $_POST['csrf_token']
  • SameSite Cookie 屬性:Set-Cookie: sid=...; SameSite=Strict

檔案上傳

  • 驗證 MIME (finfo_file()) 而非副檔名
  • 儲存路徑不可直接 Web 存取
  • 重新命名檔案、移除執行權限

10. 錯誤與異常處理

錯誤層級

E_ERROR | E_WARNING | E_NOTICE | E_DEPRECATED | E_STRICT
E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_RECOVERABLE_ERROR

配置策略

環境display_errorslog_errorserror_reporting
開發OnOffE_ALL
生產OffOnE_ALL & ~E_DEPRECATED & ~E_STRICT

自訂錯誤/異常處理器

set_error_handler(function($level, $msg, $file, $line) {
    throw new ErrorException($msg, 0, $level, $file, $line);
});
set_exception_handler(function($e) {
    error_log($e->getMessage());
    // 友善錯誤頁面
});

異常處理流程

try {
    // 風險代碼
} catch (SpecificException $e) {
    // 特定處理
} catch (Exception $e) {
    // 通用處理
} finally {
    // 清理資源
}

11. 效能優化

OPcache

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60
opcache.validate_timestamps=0  ; 生產環境關閉時間戳檢查

快取策略

  • 資料快取:Redis / Memcached (會話、查詢結果、計算結果)
  • HTTP 快取:ETag, Last-Modified, Cache-Control, Vary
  • 靜態化:生成靜態 HTML、CDN 加速
  • 本地快取:APCu (單機)、Opcode 快取

併發調優

  • Apache MPM: prefork (相容) vs worker/event (高併發)
  • PHP-FPM: pm = dynamic, pm.max_children, pm.start_servers, request_terminate_timeout
  • 壓力測試:ab -n 10000 -c 100 https://host/

12. CLI 模式

php -f script.php -- arg1 arg2
php -r 'echo "inline";'
php -l script.php          # 語法檢查
php -m                     # 已載入模組
php -i                     # phpinfo()
  • $argv、$argc 接收參數 (需 register_argc_argv=On)
  • ignore_user_abort(true)、set_time_limit(0) 長時間腳本
  • 進程管理:pcntl_fork(), posix_kill(), proc_open()

13. 常用擴充與工具

類別推薦
除錯Xdebug, phpdbg, VarDumper (Symfony)
測試PHPUnit, Codeception, Pest, Infection (突變測試)
靜態分析PHPStan, Psalm, Phan
代碼風格PHP_CodeSniffer (PSR-12), PHP-CS-Fixer, Rector
依賴管理Composer, Satis (私有倉庫)
框架Laravel, Symfony, Slim, Laminas, Yii2, CodeIgniter4
非同步Swoole, OpenSwoole, RoadRunner, ReactPHP, Amp
監控Prometheus + Grafana, Blackfire, Tideways, New Relic

總結

這份筆記匯總了 PHP 開發從入門到進階的核心知識體系。建議開發者:

  1. 熟練掌握型別系統、參考機制、錯誤處理三大基石
  2. 養成預處理語句、輸出編碼、最小權限安全習慣
  3. 善用靜態分析、單元測試、CI/CD保障品質
  4. 關注PHP 8.x 新特性:JIT、屬性、聯集型別、match 表達式、纖程
  5. 根據業務選型:傳統 MVC 用 Laravel/Symfony,高併發用 Swoole/RoadRunner,微服務用 API Platform

持續精進,享受 PHP 開發之美!

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