本文整理自超過 2000 行的 PHP 學習筆記,涵蓋命名規範、資料類型、流程控制、函數進階、物件導向、資料庫操作、錯誤處理、安全防護、效能優化等核心知識點,適合作為速查手冊與面試複習資料。
| 類型 | 慣例 | 範例 |
|---|---|---|
| 類別/介面 | PascalCase | UserService, LoggerInterface |
| 方法/函數 | camelCase | getUserById() |
| 常數 | UPPER_SNAKE_CASE | MAX_RETRY_COUNT |
| 變數/屬性 | snake_case | $user_name, private $_cache |
| 檔案 | lowercase_snake.php | user_service.php |
語言結構(非函數,不可作為回呼):echo, print, isset(), empty(), unset(), list(), array(), eval(), exit(), die()。
-2147483648 ~ 2147483647,PHP_INT_MAX, PHP_INT_SIZE。~1.8E308,精度約 14 位。\' 和 \\\n, \r, \t, \xHH, \OOO<<<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) // 函式轉換
global $var 或 $GLOBALS['var'] 存取static $v = 1; 僅初始化一次,跨呼叫保持值$GLOBALS, $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, $_SESSION, $_REQUEST, $_ENVdefine('NAME', 'value', true); // 第三參數 true=不區分大小寫
const NAME = 'value'; // 類常數、命名空間常數,區分大小寫
constant('NAME') // 動態取得常數值
// 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 回呼(信號處理、效能分析)。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 無尾呼叫優化,深度遞迴易導致堆疊溢位。
$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 |
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_state | var_export() 匯出 |
__debugInfo | var_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;
}
}
$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 = 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();
? 或 :name)使用 PDO/MySQLi 預處理;舊代碼必須用 mysqli_real_escape_string();關閉 magic_quotes_gpc。
// 輸出編碼 htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); // 富文本用 HTMLPurifier
$_SESSION['csrf_token'] === $_POST['csrf_token']Set-Cookie: sid=...; SameSite=Strictfinfo_file()) 而非副檔名E_ERROR | E_WARNING | E_NOTICE | E_DEPRECATED | E_STRICT E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_RECOVERABLE_ERROR
| 環境 | display_errors | log_errors | error_reporting |
|---|---|---|---|
| 開發 | On | Off | E_ALL |
| 生產 | Off | On | E_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 {
// 清理資源
}
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 ; 生產環境關閉時間戳檢查
ETag, Last-Modified, Cache-Control, Varyprefork (相容) vs worker/event (高併發)pm = dynamic, pm.max_children, pm.start_servers, request_terminate_timeoutab -n 10000 -c 100 https://host/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()| 類別 | 推薦 |
|---|---|
| 除錯 | 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 開發從入門到進階的核心知識體系。建議開發者:
持續精進,享受 PHP 開發之美!