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

PHP 開發速查手冊:核心函數、安全實踐與進階技巧全總結

     編輯:PHP 相關知識

前言

在 PHP 開發過程中,常用函數、安全防範、框架用法等知識點繁雜且易遺忘。本文整理自實戰筆記,涵蓋基礎語法、字串與陣列操作、資料庫交互、模板引擎、正則表達式、檔案處理、快取機制、偽靜態配置等核心領域,旨在為開發者提供一份結構清晰、可快速查閱的參考指南。

一、基礎語法與常用函數

1. 變數與型別檢查

  • isset():判斷變數是否存在且非 null。
  • empty():檢查變數是否為「空」(0、""、null、false、空陣列均視為空)。
  • unset():銷毀變數。
  • gettype():獲取變數資料型別。
  • is_array()、is_string()、is_int() 等型別判斷函數。

2. 常見魔術常數

常數說明
__FILE__當前檔案完整路徑
__LINE__當前行號
__FUNCTION__當前函數名
__CLASS__當前類別名
__METHOD__當前方法名
PHP_OS伺服器作業系統
PHP_VERSIONPHP 版本號
DIRECTORY_SEPARATOR目錄分隔符(跨平台相容)
PATH_SEPARATOR環境變數路徑分隔符

3. 錯誤處理與例外

<?php
// 抑制單行錯誤
@$result = 1/0;

// 設定錯誤報告層級
error_reporting(E_ALL); // 顯示所有錯誤
error_reporting(0);     // 關閉錯誤顯示

// 主動觸發錯誤
trigger_error("除數不能為零", E_USER_ERROR);

// Try-Catch 例外處理
try {
    throw new Exception("執行失敗");
} catch (Exception $e) {
    echo $e->getMessage();
}
?>

二、字串處理核心函數

1. 基礎操作

  • trim()、ltrim()、rtrim():移除首尾空白或指定字元。
  • strlen():取得字串長度(位元組數)。
  • mb_strlen():取得多位元組字串長度(需 mbstring 擴展)。
  • substr()、mb_substr():截取子字串。
  • strpos()、stripos()、strrpos():查找字串位置(區分大小寫/不區分/最後一次出現)。
  • str_replace()、str_ireplace():字串替換(支援陣列批量替換)。
  • strtr():字元轉換,效能優於 str_replace 單字元替換。

2. 格式化與編碼

  • sprintf()、printf():格式化字串。
  • htmlspecialchars():將特殊字元轉為 HTML 實體(防 XSS 必用)。
  • htmlentities():轉換所有可轉換字元為 HTML 實體。
  • urlencode()、urldecode():URL 編碼/解碼。
  • addslashes()、stripslashes():引號轉義/還原(資料庫輸入建議改用 Prepared Statements)。
  • mb_convert_encoding()、iconv():字元編碼轉換。

3. 進階函數

  • explode()、preg_split()、str_split():字串分割為陣列。
  • implode()(join()):陣列合併為字串。
  • str_shuffle():打亂字串順序。
  • strrev():反轉字串。
  • parse_str():將查詢字串解析為變數。
  • pathinfo()、basename()、dirname():路徑資訊解析。

三、陣列操作大全

1. 建立與填充

$arr = range(0, 10, 2);        // [0,2,4,6,8,10]
$arr = array_fill(0, 5, 'a');  // ['a','a','a','a','a']
$arr = array_pad($arr, 10, 'x'); // 補齊長度

2. 刪除、插入、合併

  • array_push() / $arr[] = $val:尾部插入(後者效能更高)。
  • array_unshift():頭部插入。
  • array_pop():移除並返回最後一個元素。
  • array_shift():移除並返回第一個元素。
  • array_splice():移除/替換指定區段(功能最強大)。
  • array_merge():合併陣列(數字鍵重新索引,字串鍵後者覆蓋)。
  • array_combine():以一個陣列為鍵、另一個為值建立新陣列。

3. 排序與遍歷

函數說明保持鍵值關聯
sort()升序否
rsort()降序否
asort()升序是
arsort()降序是
ksort()鍵名升序是
krsort()鍵名降序是
natsort()自然排序是

4. 實用工具函數

  • array_keys()、array_values():取得所有鍵/值。
  • array_flip():交換鍵與值。
  • array_unique():移除重複值。
  • array_count_values():統計值出現次數。
  • in_array()、array_key_exists()、array_search():查找。
  • array_map()、array_walk()、array_filter():回呼處理。
  • array_chunk():分割陣列。
  • shuffle()、array_rand():隨機打亂/取樣。

四、資料庫操作(MySQL / MySQLi / PDO)

1. MySQLi 物件導向風格(推薦)

<?php
$mysqli = new mysqli("localhost", "root", "root", "test");
$mysqli->set_charset("utf8mb4");

// 查詢
$sql = "SELECT id, username FROM users WHERE status = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("i", $status);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo $row['username'];
}
$stmt->close();

// 新增/修改/刪除(支援事務)
$mysqli->begin_transaction();
try {
    $stmt = $mysqli->prepare("INSERT INTO logs (msg) VALUES (?)");
    $stmt->bind_param("s", $msg);
    $stmt->execute();
    $mysqli->commit();
} catch (Exception $e) {
    $mysqli->rollback();
}
$mysqli->close();
?>

2. PDO 通用介面(支援多種資料庫)

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 查詢
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute([':id' => 1]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

// 事務
$pdo->beginTransaction();
try {
    $pdo->exec("INSERT INTO a (col) VALUES ('1')");
    $pdo->exec("INSERT INTO b (col) VALUES ('2')");
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
}
?>

五、模板引擎:Smarty 3 常用語法

1. 變數輸出與修飾符

{$var|escape}           {* HTML 轉義 *}
{$var|truncate:30:"..."} {* 截斷 *}
{$var|date_format:"%Y-%m-%d"}

2. 流程控制

{if $user.role eq 'admin'} ... {elseif $user.role eq 'editor'} ... {else} ... {/if}
{foreach from=$list item=row name=loop}
    {$row.title} [{$smarty.foreach.loop.iteration}]
{/foreach}
{section name=i loop=$data}
    {$data[i].name}
{/section}

3. 模板繼承與區塊

{* layout.tpl *}
<html><body>{block name=content}{/block}</body></html>

{* child.tpl *}
{extends file="layout.tpl"}
{block name=content}頁面內容{/block}

4. 快取與插件

  • {cacheless}...{/cacheless}:區塊不快取。
  • {insert name="func"}:動態插入(每次執行)。
  • 自訂修飾符:modifier.xxx.php,函數名 smarty_modifier_xxx。
  • 自訂函數:function.xxx.php,函數名 smarty_function_xxx。

六、XML 處理三大方式

1. SAX (xml_parser) — 事件驅動,記憶體效率高

$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "textData");
while ($data = fread($fp, 4096)) xml_parse($parser, $data);
xml_parser_free($parser);

2. DOMDocument — 樹狀結構,支援 XPath、修改文件

$dom = new DOMDocument();
$dom->load('file.xml');
$books = $dom->getElementsByTagName('book');
foreach ($books as $book) {
    echo $book->getElementsByTagName('title')->item(0)->nodeValue;
}

3. SimpleXML — 簡單易用,適合唯讀

$xml = simplexml_load_file('file.xml');
echo $xml->book[0]->title;
foreach ($xml->book as $book) {
    echo (string)$book->author;
}

七、正則表達式 (PCRE) 完整速查

1. 常用元字元

符號含義
.任意單一字元(除換行符)
\d數字 [0-9]
\D非數字
\w單字字元 [A-Za-z0-9_]
\W非單字字元
\s空白字元
\S非空白字元
\b單字邊界
^字串開頭
$字串結尾
*零次或多次 {0,}
+一次或多次 {1,}
?零次或一次 {0,1}
{n,m}n 到 m 次
|或
()捕獲群組
(?:)非捕獲群組
(?=)正向前瞻
(?!)負向前瞻

2. 模式修飾符

  • i:忽略大小寫。
  • s:. 匹配換行符。
  • m:多行模式(^$匹配行首尾)。
  • U:非貪婪模式(預設貪婪)。
  • e:preg_replace 替換字串作為 PHP 代碼執行(已棄用,勿用)。

3. 實戰範例

// Email 驗證
/^[\w\-\.]+@([\w-]+\.)+[\w-]{2,4}$/

// 手機號(中國大陸)
/^1[3-9]\d{9}$/

// URL 解析
/(\w+):\/\/([^\/]+)(.*)/

// 中文匹配 (UTF-8)
/[\x{4e00}-\x{9fa5}]+/u

// 去除 HTML 標籤
/<[^>]+>/

八、檔案與目錄操作

1. 讀寫常用函數

  • file_get_contents()、file_put_contents():簡單高效(大檔案慎用)。
  • fopen()、fread()、fwrite()、fclose():流式控制,適合大檔案。
  • fgets():逐行讀取。
  • file():整個檔案讀入陣列(每行一元素)。
  • readfile():直接輸出至瀏覽器(下載檔案常用)。

2. 目錄遍歷

$dir = new DirectoryIterator('./uploads');
foreach ($dir as $file) {
    if ($file->isDot()) continue;
    echo $file->getFilename() . ' (' . $file->getSize() . ' bytes)<br>';
}
// 或使用 glob()
$files = glob('*.php');

3. 檔案屬性與權限

  • file_exists()、is_file()、is_dir()、is_readable()、is_writable()。
  • filesize()、filemtime()、filectime()、fileatime()。
  • chmod()、chown()、chgrp()。
  • mkdir()、rmdir()、unlink()、rename()、copy()。

九、Session 與 Cookie 進階設定

<?php
session_start();

// 設定 Session 存活時間 (秒)
ini_set('session.gc_maxlifetime', 3600);
ini_set('session.cookie_lifetime', 3600);

// 自訂儲存路徑(分級目錄提升效能)
ini_set('session.save_path', '2;/tmp/sessions');

// 客戶端禁用 Cookie 時,自動透過 URL 傳遞 SID
ini_set('session.use_trans_sid', 1);
ini_set('session.use_only_cookies', 0);

// 銷毀 Session
$_SESSION = [];
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
}
session_destroy();
?>

十、快取策略

1. Memcached 基礎操作

$mem = new Memcached();
$mem->addServer('127.0.0.1', 11211);

$mem->set('key', $data, 3600); // 存入,過期 1 小時
$val = $mem->get('key');
$mem->delete('key');
$mem->flush(); // 清空所有

2. 輸出緩衝 (ob) 靜態化頁面

<?php
$staticFile = 'cache/page.html';
$phpFile = __FILE__;

// 快取有效期 10 秒,或原始檔案更新則重新生成
if (!file_exists($staticFile) || (filemtime($staticFile) + 10 < time()) || filemtime($phpFile) > filemtime($staticFile)) {
    ob_start();
    // ... 輸出動態內容 ...
    $content = ob_get_clean();
    file_put_contents($staticFile, $content);
}
echo file_get_contents($staticFile);
?>

十一、Apache 偽靜態 (.htaccess) 實戰

1. 啟用 Rewrite 模組

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# 防盜鏈
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain\.com [NC]
RewriteRule \.(gif|jpg|png|webp)$ /images/hotlink.png [R=302,L]

# 禁止目錄瀏覽
Options -Indexes

# SEO 友好 301 重導向
Redirect 301 /old-page.html /new-page/

# 自訂 404 頁面
ErrorDocument 404 /404.html

# 強制 HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# 靜態資源快取
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>

# GZIP 壓縮
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json
</IfModule>

# URL 重寫範例:/article/123.html -> /article.php?id=123
RewriteRule ^article/([0-9]+)\.html$ article.php?id=$1 [L]
</IfModule>

十二、序列化與反序列化

<?php
class User {
    public $id;
    public $name;
    private $token;

    public function __sleep() {
        return ['id', 'name']; // 僅序列化這些屬性
    }

    public function __wakeup() {
        $this->token = generate_token(); // 反序列化後重新生成
    }
}

$user = new User();
$user->id = 1;
$user->name = 'John';
$serialized = serialize($user);
// 存入資料庫/檔案/快取
$restored = unserialize($serialized);
?>

十三、ThinkPHP 5/6 常用速查

  • 模型查詢:Db::name('user')->where('id', '>', 10)->order('id desc')->limit(10)->select();
  • 請求參數:Request::instance()->param('id/d', 0); (類型轉換)。
  • 驗證器:validate(UserValidate::class)->check($data);。
  • 快取:Cache::set('key', $val, 3600); Cache::get('key');。
  • 異常處理:try { ... } catch (\think\exception\ValidateException $e) { ... }。
  • 中介軟體:全域/路由/控制器中介軟體實現認證、日誌、CORS 等。

十四、PHP 8 新特性亮點

  • JIT 編譯器:效能大幅提升(計算密集型任務明顯)。
  • Union Types:function foo(int|float $num): string|bool {}。
  • Named Arguments:foo(name: 'Tom', age: 18);。
  • Attributes (屬性):#[Route("/api/user")] 取代註解。
  • Match Expression:$result = match($x) { 1 => 'one', default => 'other' };。
  • Nullsafe Operator:$user?->profile?->avatar?。
  • Constructor Property Promotion:public function __construct(public string $name) {}。
  • str_contains()、str_starts_with()、str_ends_with():字串檢查更直觀。

結語

本手冊涵蓋 PHP 開發高頻知識點,建議收藏並在實戰中靈活查閱。技術更新迭代快,請以官方文檔為準,持續關注 PHP 8.x 新特性與最佳實踐,編寫更安全、高效、可維護的代碼。

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