<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="pretty-atom-feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hant">
  <title>光輝咖碼</title>
  <subtitle>光輝咖碼是一個分享網站架設、WordPress、靜態網站生成器、程式開發等技術主題的部落格。提供實用的教學文章和工具介紹，幫助讀者建立和管理自己的網站。</subtitle>
  <link href="https://kamadiam.com/feed/feed.xml" rel="self" />
  <link href="https://kamadiam.com/" />
  <updated>2026-07-28T08:20:00Z</updated>
  <id>https://kamadiam.com/</id>
  <author>
    <name>huihere</name>
  </author>
  <entry>
    <title>Pi Coding Agent 完整指南：極簡終端 AI 程式助手入門與實戰工作流（2026）</title>
    <link href="https://kamadiam.com/pi-coding-agent/" />
    <updated>2026-07-28T08:20:00Z</updated>
    <id>https://kamadiam.com/pi-coding-agent/</id>
    <content type="html">&lt;p&gt;你是不是也遇過這種情況：開了某個 AI 程式助手，它硬要你走「先規劃 → 再開子代理 → 再審查」的流程，結果改一個小 bug 也要等它跑完一整串儀式？&lt;p&gt;市面上很多 Coding Agent 越來越像「整套 IDE 替代品」，而不是「幫你省時間的夥伴」。如果你想要的是：&lt;strong&gt;極簡、快、能嵌進自己習慣的終端工作流&lt;/strong&gt;，那值得認識 &lt;strong&gt;Pi Coding Agent&lt;/strong&gt;（&lt;a href=&quot;https://pi.dev/&quot;&gt;pi.dev&lt;/a&gt;）。&lt;p&gt;這篇會帶你從「它是什麼」一路走到「怎麼裝、怎麼設定、怎麼跟 Cursor 分工」——讀完你可以決定要不要試，以及該用哪種工作流模式。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E4%BB%80%E9%BA%BC%E6%98%AF-Pi-Coding-Agent?&quot;&gt;什麼是 Pi Coding Agent？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#Pi-vs-Cursor-vs-Claude-Code%E8%A9%B2%E9%81%B8%E8%AA%B0?&quot;&gt;Pi vs Cursor vs Claude Code：該選誰？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E5%9B%9B%E7%A8%AE%E9%81%8B%E4%BD%9C%E6%A8%A1%E5%BC%8F&quot;&gt;四種運作模式&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8BPi-%E7%9C%9F%E6%AD%A3%E5%8E%B2%E5%AE%B3%E7%9A%84%E5%9C%B0%E6%96%B9&quot;&gt;上下文工程：Pi 真正厲害的地方&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E7%82%BA%E4%BB%80%E9%BA%BC-Pi-%E5%88%BB%E6%84%8F%E4%B8%8D%E5%85%A7%E5%BB%BA-MCP%E5%AD%90%E4%BB%A3%E7%90%86Plan-mode?&quot;&gt;為什麼 Pi 刻意不內建 MCP、子代理、Plan mode？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E5%A5%97%E4%BB%B6%E9%81%B8%E5%9E%8B%E4%B8%8D%E8%A6%81%E4%B8%80%E9%96%8B%E5%A7%8B%E8%A3%9D%E6%BB%BF%E6%8E%92%E8%A1%8C%E6%A6%9C&quot;&gt;套件選型：不要一開始裝滿排行榜&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E4%BA%94%E9%9A%8E%E6%AE%B5%E5%AF%A6%E6%88%B0%E5%B7%A5%E4%BD%9C%E6%B5%81&quot;&gt;五階段實戰工作流&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E5%AE%89%E8%A3%9D%E8%88%87%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%AF%A6%E6%88%B0%E7%B4%84-10-%E5%88%86%E9%90%98&quot;&gt;安裝與第一次實戰（約 10 分鐘）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E6%8E%A8%E8%96%A6%E5%B7%A5%E5%85%B7%E8%88%87%E8%B3%87%E6%BA%90&quot;&gt;推薦工具與資源&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E7%B5%90%E8%AA%9E%E5%9B%9E%E6%AD%B8%E6%A5%B5%E7%B0%A1,%E4%BD%86%E5%88%A5%E5%9B%9E%E6%AD%B8%E4%BD%8E%E6%95%88&quot;&gt;結語：回歸極簡，但別回歸低效&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;什麼是-Pi-Coding-Agent?&quot;&gt;什麼是 Pi Coding Agent？&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Pi Coding Agent&lt;/strong&gt; 是跑在終端機（Terminal）裡的 AI 程式開發助手，由 Earendil Inc. 維護。它的設計哲學可以濃縮成一句話：&lt;blockquote&gt;&lt;p&gt;世界上有很多 Agent 框架，但這一個是&lt;strong&gt;你的&lt;/strong&gt;——工具來適應你，不是你來適應工具。&lt;/blockquote&gt;&lt;p&gt;跟 Devin、重度多代理編排系統不同，Pi 走的是 &lt;strong&gt;「極簡核心 + 按需擴充」&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;核心只有四個工具&lt;/strong&gt;：&lt;code&gt;read&lt;/code&gt;、&lt;code&gt;write&lt;/code&gt;、&lt;code&gt;edit&lt;/code&gt;、&lt;code&gt;bash&lt;/code&gt;&lt;li&gt;&lt;strong&gt;不內建&lt;/strong&gt; sub-agent、Plan mode、全專案向量索引&lt;li&gt;&lt;strong&gt;能力靠你自己加&lt;/strong&gt;：&lt;code&gt;AGENTS.md&lt;/code&gt;、Skills、Extensions、Pi Packages&lt;/ul&gt;&lt;p&gt;白話說：你在專案資料夾打 &lt;code&gt;pi&lt;/code&gt;，就能用自然語言叫 AI 讀檔、改 code、跑測試；要不要加 MCP、子代理、網頁搜尋，全由你決定。&lt;h3 id=&quot;四層架構看懂-Pi-在幹嘛&quot;&gt;四層架構（看懂 Pi 在幹嘛）&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;層級&lt;th&gt;做什麼&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CLI / TUI&lt;/strong&gt;&lt;td&gt;終端互動、顯示 token 與狀態、高風險操作的人工確認&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Agent 協調&lt;/strong&gt;&lt;td&gt;ReAct 迴圈：想 → 做 → 看結果 → 再修正&lt;tr&gt;&lt;td&gt;&lt;strong&gt;工具與上下文&lt;/strong&gt;&lt;td&gt;四工具 + Extension 注入的 RAG / MCP&lt;tr&gt;&lt;td&gt;&lt;strong&gt;持久化&lt;/strong&gt;&lt;td&gt;Session 樹狀歷史、JSONL 日誌，可 fork、可匯出&lt;/table&gt;&lt;p&gt;把 AI 直接放在終端的好處很實際：不用再「複製錯誤訊息 → 貼到聊天窗 → 複製修復 code 回來」。Linter 報錯、測試失敗，Agent 可以直接讀輸出並迭代修正。&lt;h2 id=&quot;Pi-vs-Cursor-vs-Claude-Code該選誰?&quot;&gt;Pi vs Cursor vs Claude Code：該選誰？&lt;/h2&gt;&lt;p&gt;Pi 不是 Cursor 的平替，而是不同取捨。下面這張表幫你 30 秒判斷：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;維度&lt;th&gt;Pi Coding Agent&lt;th&gt;Claude Code&lt;th&gt;Cursor Agent&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;核心工具&lt;/strong&gt;&lt;td&gt;4 個（read/write/edit/bash）&lt;td&gt;10+ 內建&lt;td&gt;IDE + MCP + 多模型&lt;tr&gt;&lt;td&gt;&lt;strong&gt;上下文來源&lt;/strong&gt;&lt;td&gt;AGENTS.md + Extension 注入&lt;td&gt;CLAUDE.md + 選擇性讀檔&lt;td&gt;全專案向量索引 + &lt;code&gt;@&lt;/code&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Sub-agents&lt;/strong&gt;&lt;td&gt;無（Package 自建）&lt;td&gt;內建 Task&lt;td&gt;Background Agent&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Plan mode&lt;/strong&gt;&lt;td&gt;無（Prompt Template 替代）&lt;td&gt;內建&lt;td&gt;Composer 規劃&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RAG / 索引&lt;/strong&gt;&lt;td&gt;社群 Extension（如 pi-local-rag）&lt;td&gt;grep + 讀檔&lt;td&gt;自動 codebase embedding&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Session&lt;/strong&gt;&lt;td&gt;&lt;strong&gt;樹狀分支&lt;/strong&gt; + compact&lt;td&gt;線性 + compact&lt;td&gt;多 chat tab&lt;tr&gt;&lt;td&gt;&lt;strong&gt;部署&lt;/strong&gt;&lt;td&gt;CLI / RPC / SDK 嵌入&lt;td&gt;CLI only&lt;td&gt;Desktop IDE&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Token 效率&lt;/strong&gt;&lt;td&gt;極小 system prompt&lt;td&gt;中等&lt;td&gt;較高&lt;tr&gt;&lt;td&gt;&lt;strong&gt;最適合&lt;/strong&gt;&lt;td&gt;終端實驗、SDK 嵌入、可版本控制的 Agent 設定&lt;td&gt;Anthropic 生態深度使用者&lt;td&gt;日常 IDE 多檔編輯&lt;/table&gt;&lt;h3 id=&quot;依場景選工具&quot;&gt;依場景選工具&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的情境&lt;th&gt;建議&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;大型 monorepo、要靠自動索引&lt;td&gt;Cursor / Claude Code&lt;tr&gt;&lt;td&gt;Side project、終端一把梭&lt;td&gt;&lt;strong&gt;Pi&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;本地模型、低 VRAM、要控 token&lt;td&gt;&lt;strong&gt;Pi&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;Agent 設定要進 Git（&lt;code&gt;AGENTS.md&lt;/code&gt;、&lt;code&gt;.pi/&lt;/code&gt;）&lt;td&gt;&lt;strong&gt;Pi&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;自建產品要嵌 Agent（SDK）&lt;td&gt;&lt;strong&gt;Pi&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;UI 調像素、邊預覽邊改&lt;td&gt;Cursor&lt;/table&gt;&lt;p&gt;&lt;strong&gt;實戰分工&lt;/strong&gt;（很多人兩邊都裝）：主專案用 Cursor 改 UI、多檔 refactor；Pi 負責終端批次任務、長跑腳本、低成本實驗。&lt;strong&gt;同一目錄同一時間只讓一邊寫檔&lt;/strong&gt;——並行時用 git worktree 隔離。&lt;h2 id=&quot;四種運作模式&quot;&gt;四種運作模式&lt;/h2&gt;&lt;p&gt;Pi 不只有「開 TUI 聊天」：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模式&lt;th&gt;怎麼用&lt;th&gt;適合&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Interactive（互動）&lt;/strong&gt;&lt;td&gt;專案目錄執行 &lt;code&gt;pi&lt;/code&gt;&lt;td&gt;日常對話、除錯、改 code&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Print / JSON&lt;/strong&gt;&lt;td&gt;&lt;code&gt;pi -p &amp;quot;分析此 repo&amp;quot;&lt;/code&gt;、&lt;code&gt;--mode json&lt;/code&gt;&lt;td&gt;腳本自動化、結構化事件流&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RPC&lt;/strong&gt;&lt;td&gt;stdin/stdout JSON 協議&lt;td&gt;非 Node 系統整合&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SDK&lt;/strong&gt;&lt;td&gt;嵌入自己的 TS 應用&lt;td&gt;自建 Agent 產品&lt;/table&gt;&lt;p&gt;互動模式裡還有兩個很多人愛用的即時控制：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Steering（&lt;code&gt;Enter&lt;/code&gt;）&lt;/strong&gt;：Agent 還在跑時，你可以立刻送新指令糾偏；目前工具執行完就切方向，不會傻等整條鏈跑完。&lt;li&gt;&lt;strong&gt;Follow-up（&lt;code&gt;Alt + Enter&lt;/code&gt;）&lt;/strong&gt;：排程下一則訊息，等當前任務完成後自動接上。&lt;/ul&gt;&lt;p&gt;長對話別硬撐——用 &lt;code&gt;/compact&lt;/code&gt; 壓縮舊訊息，或 &lt;code&gt;/tree&lt;/code&gt; 開分支試另一條路，歷史都留在同一個 session 檔裡。&lt;h2 id=&quot;上下文工程Pi-真正厲害的地方&quot;&gt;上下文工程：Pi 真正厲害的地方&lt;/h2&gt;&lt;p&gt;AI 回得好不好，八成看上下文怎麼塞。Pi 的策略是：&lt;strong&gt;Harness 保持極簡，上下文全部可組合、可版本控制。&lt;/strong&gt;&lt;h3 id=&quot;1.-Context-FilesAGENTS.md-/-SYSTEM.md&quot;&gt;1. Context Files（&lt;code&gt;AGENTS.md&lt;/code&gt; / &lt;code&gt;SYSTEM.md&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;Pi 啟動時會串接多層指令檔：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;載入順序&lt;th&gt;路徑&lt;th&gt;用途&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;全域&lt;td&gt;&lt;code&gt;~/.pi/agent/AGENTS.md&lt;/code&gt;&lt;td&gt;個人通用規範&lt;tr&gt;&lt;td&gt;父目錄&lt;td&gt;向上遞迴的 &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;td&gt;Monorepo 子專案繼承&lt;tr&gt;&lt;td&gt;當前目錄&lt;td&gt;&lt;code&gt;./AGENTS.md&lt;/code&gt;&lt;td&gt;專案專屬規則&lt;/table&gt;&lt;p&gt;&lt;code&gt;SYSTEM.md&lt;/code&gt; 可&lt;strong&gt;完全替換或追加&lt;/strong&gt;預設 system prompt——適合鎖語言、安全邊界、角色人設。&lt;p&gt;實戰建議再配一份 &lt;code&gt;APPEND_SYSTEM.md&lt;/code&gt;（放 &lt;code&gt;~/.pi/agent/&lt;/code&gt;）：跨專案行為，例如「先讀本地、危險操作先問、不確定就停下來問人」。它的權重通常高於專案 &lt;code&gt;AGENTS.md&lt;/code&gt;。&lt;p&gt;範例（專案根 &lt;code&gt;AGENTS.md&lt;/code&gt;）：&lt;pre class=&quot;language-markdown&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; Project Instructions&lt;/span&gt;
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; 改 code 後跑 &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`npm run check`&lt;/span&gt;。
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; 不要動 production 設定檔。
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; 不確定時先問我。&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;2.-Skills按需載入的能力包&quot;&gt;2. Skills：按需載入的能力包&lt;/h3&gt;&lt;p&gt;Skills 是 Markdown 檔，frontmatter 有 &lt;code&gt;name&lt;/code&gt; 和 &lt;code&gt;description&lt;/code&gt;。Pi 只在 system prompt 放&lt;strong&gt;摘要&lt;/strong&gt;；Agent 要用 &lt;code&gt;read&lt;/code&gt; 才載入全文——避免一次塞爆 context。&lt;p&gt;手動觸發：&lt;code&gt;/skill:git-workflow&lt;/code&gt;。發現路徑：&lt;code&gt;~/.pi/agent/skills/&lt;/code&gt;、&lt;code&gt;.pi/skills/&lt;/code&gt;、&lt;code&gt;.agents/skills/&lt;/code&gt;（專案 skills 需 trust 專案）。&lt;h3 id=&quot;3.-Prompt-Templates可重用的-/-指令&quot;&gt;3. Prompt Templates：可重用的 &lt;code&gt;/&lt;/code&gt; 指令&lt;/h3&gt;&lt;p&gt;帶參數的 Markdown 模板，例如 &lt;code&gt;/review src/auth.ts&lt;/code&gt; 展開成完整審查 prompt。支援 &lt;code&gt;$1&lt;/code&gt;、&lt;code&gt;$ARGUMENTS&lt;/code&gt; 等替換。適合標準化 code review、部署 checklist。&lt;h3 id=&quot;4.-Extensions動態注入-RAG&quot;&gt;4. Extensions：動態注入 RAG&lt;/h3&gt;&lt;p&gt;TypeScript 模組可訂閱 &lt;code&gt;context&lt;/code&gt; 事件，在每次 LLM 呼叫前改 message 陣列。社群 &lt;strong&gt;pi-local-rag&lt;/strong&gt; 就是典型：本地 BM25 + 向量混合檢索，按 turn 注入相關 chunks，不動 system prompt，維持 KV-cache 效率。&lt;h3 id=&quot;Project-Trust安全邊界&quot;&gt;Project Trust（安全邊界）&lt;/h3&gt;&lt;p&gt;專案含 &lt;code&gt;.pi/&lt;/code&gt; 或 &lt;code&gt;.agents/skills/&lt;/code&gt; 時，Pi 會問你是否 &lt;strong&gt;trust&lt;/strong&gt;。未信任前只載入 context files；信任後才載入專案 extensions——避免惡意 repo 配置執行任意程式碼。&lt;h2 id=&quot;為什麼-Pi-刻意不內建-MCP子代理Plan-mode?&quot;&gt;為什麼 Pi 刻意不內建 MCP、子代理、Plan mode？&lt;/h2&gt;&lt;p&gt;這不是「功能缺失」，是設計選擇：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;刻意省略&lt;th&gt;為什麼&lt;th&gt;需要時怎麼辦&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;MCP&lt;td&gt;傳統整合可吃掉半個 context&lt;td&gt;&lt;code&gt;pi install npm:pi-mcp-adapter&lt;/code&gt;&lt;tr&gt;&lt;td&gt;Sub-agents&lt;td&gt;避免核心膨脹、強制工作流&lt;td&gt;&lt;code&gt;pi install npm:pi-subagents&lt;/code&gt;&lt;tr&gt;&lt;td&gt;Plan mode&lt;td&gt;不想 opinionated 規劃儀式&lt;td&gt;Prompt Template 或 &lt;code&gt;/plan&lt;/code&gt; Extension&lt;tr&gt;&lt;td&gt;IDE 整合&lt;td&gt;專注終端 Harness&lt;td&gt;RPC / SDK 給外部嵌&lt;/table&gt;&lt;p&gt;官方態度很直白：&lt;strong&gt;Ask Pi to build it, or install a package.&lt;/strong&gt;&lt;p&gt;套件安裝範例：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pi &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; npm:pi-mcp-adapter    &lt;span class=&quot;token comment&quot;&gt;# MCP 生態，~200 token 代理工具&lt;/span&gt;
pi &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; npm:pi-subagents      &lt;span class=&quot;token comment&quot;&gt;# scout → planner → worker 鏈&lt;/span&gt;
pi &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; npm:pi-web-access     &lt;span class=&quot;token comment&quot;&gt;# 網頁搜尋與抓取&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;套件選型不要一開始裝滿排行榜&quot;&gt;套件選型：不要一開始裝滿排行榜&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://pi.dev/packages&quot;&gt;pi.dev/packages&lt;/a&gt; 已有 50+ 社群套件。&lt;strong&gt;最佳實務是 Tier 0 起步，痛點出現再加。&lt;/strong&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tier&lt;th&gt;組合&lt;th&gt;適合&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tier 0&lt;/strong&gt;&lt;td&gt;僅 &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;td&gt;小 patch、學習四工具&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tier 1&lt;/strong&gt;&lt;td&gt;+ &lt;code&gt;pi-mcp-adapter&lt;/code&gt; + &lt;code&gt;pi-subagents&lt;/code&gt;&lt;td&gt;日常 feature、review 迴圈&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tier 2&lt;/strong&gt;&lt;td&gt;+ &lt;code&gt;pi-web-access&lt;/code&gt; / &lt;code&gt;pi-codex-goal&lt;/code&gt; / &lt;code&gt;context-mode&lt;/code&gt;&lt;td&gt;長任務、context 膨脹&lt;/table&gt;&lt;h3 id=&quot;pi-mcp-adapterMCP-但不炸-context&quot;&gt;pi-mcp-adapter：MCP 但不炸 context&lt;/h3&gt;&lt;p&gt;傳統 MCP 可能一個 server 就 10k+ tokens。&lt;strong&gt;pi-mcp-adapter&lt;/strong&gt; 用單一 &lt;code&gt;mcp&lt;/code&gt; 代理工具（約 200 token）按需發現與呼叫：&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mcp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;screenshot&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;mcp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chrome_devtools_take_screenshot&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;mcp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;tool&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chrome_devtools_take_screenshot&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{&quot;format&quot;: &quot;png&quot;}&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Server 預設 &lt;strong&gt;lazy 啟動&lt;/strong&gt;（第一次呼叫才連線）。常用工具可設 &lt;code&gt;directTools&lt;/code&gt; 升級為一級工具。&lt;h3 id=&quot;pi-subagents子代理怎麼編排&quot;&gt;pi-subagents：子代理怎麼編排&lt;/h3&gt;&lt;p&gt;內建 8 種角色：&lt;code&gt;scout&lt;/code&gt;、&lt;code&gt;researcher&lt;/code&gt;、&lt;code&gt;planner&lt;/code&gt;、&lt;code&gt;worker&lt;/code&gt;、&lt;code&gt;reviewer&lt;/code&gt;、&lt;code&gt;oracle&lt;/code&gt; 等。支援 &lt;strong&gt;單一、鏈式（chain）、並行（parallel）&lt;/strong&gt; 三種模式。&lt;p&gt;實戰 prompt 範例：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Use scout to map the auth flow, then planner for an implementation plan.
Run parallel reviewers: correctness, tests, and unnecessary complexity.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意：parallel 模式 token 成本會倍增；裝了套件也不會自動跑 reviewer——要在 prompt 或 &lt;code&gt;AGENTS.md&lt;/code&gt; 裡&lt;strong&gt;明確要求&lt;/strong&gt;。&lt;h2 id=&quot;五階段實戰工作流&quot;&gt;五階段實戰工作流&lt;/h2&gt;&lt;p&gt;Pi 沒有「唯一官方流程」，但下面這套在實戰中最穩：&lt;pre&gt;&lt;code&gt;Phase 0  設定層（一次性）
   AGENTS.md + APPEND_SYSTEM.md + 精選 packages
        ↓
Phase 1  任務釐清
   自然語言目標 → 大任務用 create_goal 或 planner
        ↓
Phase 2  探索（唯讀）
   scout / read+grep / web-access
        ↓
Phase 3  實作
   worker 或主 session 小步 edit
        ↓
Phase 4  驗證閉環
   bash 跑 test/lint → reviewer → 修正
        ↓
Phase 5  上下文維護
   /compact、/tree 分支、context-mode（長 session）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;三個反模式請避開：&lt;/strong&gt;&lt;ol&gt;&lt;li&gt;一開始裝滿熱門榜——context 與認知負擔暴增&lt;li&gt;長專案只靠對話記憶——應寫進 &lt;code&gt;AGENTS.md&lt;/code&gt;、goal 檔或 &lt;code&gt;plan.md&lt;/code&gt;&lt;li&gt;沒給驗證條件就「改到好」——一定要指定 test/lint 成功才算完&lt;/ol&gt;&lt;p&gt;探索階段原則：&lt;strong&gt;計畫寫進檔案&lt;/strong&gt;（&lt;code&gt;plan.md&lt;/code&gt;、&lt;code&gt;context.md&lt;/code&gt;），先讀本地，不足再 web，大改前先跟人確認。&lt;h2 id=&quot;安裝與第一次實戰約-10-分鐘&quot;&gt;安裝與第一次實戰（約 10 分鐘）&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;前置&lt;/strong&gt;：Node.js &lt;strong&gt;≥ 22.19.0&lt;/strong&gt;。&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 方式 A：官方 npm（方便鎖版本）&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; --ignore-scripts @earendil-works/pi-coding-agent

&lt;span class=&quot;token comment&quot;&gt;# 方式 B：macOS / Linux 一鍵腳本&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://pi.dev/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;確認：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;# ≥ 22.19.0&lt;/span&gt;
pi &lt;span class=&quot;token parameter variable&quot;&gt;--help&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;登入模型（憑證存 &lt;code&gt;~/.pi/agent/auth.json&lt;/code&gt;）：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /path/to/your-sandbox-project   &lt;span class=&quot;token comment&quot;&gt;# 先用可弄髒的 side project&lt;/span&gt;
pi
/login&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;支援 Claude / ChatGPT / Copilot 訂閱 OAuth，或各廠 API Key。CI 可用環境變數，例如 &lt;code&gt;export ANTHROPIC_API_KEY=...&lt;/code&gt;。&lt;p&gt;第一次驗證：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Summarize this repository and tell me how to run its checks.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;進階試試：&lt;code&gt;@README.md&lt;/code&gt; 附加檔案、&lt;code&gt;!npm run lint&lt;/code&gt; 跑 shell、&lt;code&gt;pi -p &amp;quot;Summarize&amp;quot;&lt;/code&gt; 非互動模式。&lt;h3 id=&quot;新手常見踩坑&quot;&gt;新手常見踩坑&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;狀況&lt;th&gt;怎麼修&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;pi: command not found&lt;/code&gt;&lt;td&gt;確認 npm global &lt;code&gt;bin&lt;/code&gt; 在 PATH&lt;tr&gt;&lt;td&gt;沒 API key&lt;td&gt;在 Pi 內 &lt;code&gt;/login&lt;/code&gt; 或設 env&lt;tr&gt;&lt;td&gt;AI 亂改重要檔&lt;td&gt;用 sandbox repo + &lt;code&gt;AGENTS.md&lt;/code&gt; 限制&lt;tr&gt;&lt;td&gt;聊越久越糊&lt;td&gt;&lt;code&gt;/compact&lt;/code&gt; 或 &lt;code&gt;/new&lt;/code&gt;&lt;tr&gt;&lt;td&gt;想要 MCP 但沒有&lt;td&gt;&lt;code&gt;pi install npm:pi-mcp-adapter&lt;/code&gt;&lt;/table&gt;&lt;h2 id=&quot;推薦工具與資源&quot;&gt;推薦工具與資源&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;th&gt;適合誰&lt;th&gt;一句話&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://pi.dev/&quot;&gt;Pi Coding Agent&lt;/a&gt;&lt;/strong&gt;&lt;td&gt;想控 context、終端 workflow、SDK 嵌入&lt;td&gt;極簡四工具 + 按需擴充，&lt;strong&gt;本文明星推薦&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;td&gt;日常 IDE 多檔編輯、UI 調整&lt;td&gt;索引與預覽強，跟 Pi 互補而非互斥&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;td&gt;Anthropic 訂閱深度使用者&lt;td&gt;終端 Agent，內建功能較多、較 opinionated&lt;tr&gt;&lt;td&gt;&lt;strong&gt;pi-mcp-adapter&lt;/strong&gt;&lt;td&gt;要用 MCP 又怕 context 爆炸&lt;td&gt;Pi 生態 MCP 首選&lt;tr&gt;&lt;td&gt;&lt;strong&gt;pi-subagents&lt;/strong&gt;&lt;td&gt;需要 scout/reviewer 鏈&lt;td&gt;補 Pi 不內建子代理的缺口&lt;/table&gt;&lt;p&gt;延伸閱讀：&lt;a href=&quot;https://pi.dev/docs/latest/quickstart&quot;&gt;Pi Quickstart&lt;/a&gt;、&lt;a href=&quot;https://pi.dev/docs/latest/concepts/extensibility&quot;&gt;Extensibility 文件&lt;/a&gt;、&lt;a href=&quot;https://pi.dev/packages&quot;&gt;Pi Packages 目錄&lt;/a&gt;。&lt;h2 id=&quot;結語回歸極簡,但別回歸低效&quot;&gt;結語：回歸極簡，但別回歸低效&lt;/h2&gt;&lt;p&gt;Pi Coding Agent 重新定義了「AI 助手該怎麼存在於開發流程裡」——不試圖接管整個 IDE，而是當一個&lt;strong&gt;快、可配置、可版本控制&lt;/strong&gt;的終端夥伴。&lt;p&gt;三個 takeaway：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;極簡核心&lt;/strong&gt;（四工具）換來 token 效率與完整上下文控制權&lt;li&gt;&lt;strong&gt;能力按需加&lt;/strong&gt;（Packages / Skills / Extensions），不要一開始裝滿&lt;li&gt;&lt;strong&gt;跟 Cursor 分工&lt;/strong&gt;：IDE 改 UI、Pi 跑終端批次與實驗——同一 worktree 別兩邊同時寫&lt;/ol&gt;&lt;p&gt;若你厭倦了沉重、黑盒、硬塞工作流的 AI 工具，建議先用 sandbox 專案試一輪：&lt;strong&gt;到 &lt;a href=&quot;https://pi.dev/&quot;&gt;pi.dev&lt;/a&gt; 安裝 → &lt;code&gt;/login&lt;/code&gt; → 寫一份 &lt;code&gt;AGENTS.md&lt;/code&gt; → 跑一個小任務驗證四工具閉環&lt;/strong&gt;。覺得順了，再按需加 &lt;code&gt;pi-mcp-adapter&lt;/code&gt; 與 &lt;code&gt;pi-subagents&lt;/code&gt;。</content>
  </entry>
  <entry>
    <title>PageSpeed Insights 與 Core Web Vitals 2026 完全指南</title>
    <link href="https://kamadiam.com/pagespeed-core-web-vitals-2026/" />
    <updated>2026-07-07T02:00:00Z</updated>
    <id>https://kamadiam.com/pagespeed-core-web-vitals-2026/</id>
    <content type="html">&lt;p&gt;網站速度不只影響使用者體驗，也與 Google 搜尋排名相關。要衡量與改善效能，&lt;strong&gt;PageSpeed Insights（PSI）&lt;/strong&gt; 仍是最常用的免費工具——但 2024 年後 Core Web Vitals 已從 FID 改為 &lt;strong&gt;INP&lt;/strong&gt;，很多人還在用舊觀念解讀分數。&lt;p&gt;本文整理 2026 年門檻、實地數據（CrUX）與實驗室數據（Lighthouse）的差異，以及 WordPress／靜態網站各自該優先處理什麼。若你只想先動手，可直接跳到「30 分鐘優化 Checklist」。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals-2026/#PageSpeed-Insights-%E6%98%AF%E4%BB%80%E9%BA%BC&quot;&gt;PageSpeed Insights 是什麼&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals-2026/#Core-Web-Vitals-2026%E4%B8%89%E9%A0%85%E6%8C%87%E6%A8%99%E8%88%87%E9%96%80%E6%AA%BB&quot;&gt;Core Web Vitals 2026：三項指標與門檻&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals-2026/#%E5%AF%A6%E5%9C%B0%E6%95%B8%E6%93%9A-vs-Lighthouse%E8%A9%B2%E4%BF%A1%E5%93%AA%E5%80%8B&quot;&gt;實地數據 vs Lighthouse：該信哪個&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals-2026/#30-%E5%88%86%E9%90%98%E5%84%AA%E5%8C%96-Checklist&quot;&gt;30 分鐘優化 Checklist&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals-2026/#WordPress-%E7%AB%99%E7%9A%84%E5%B8%B8%E8%A6%8B%E8%B7%AF%E5%BE%91&quot;&gt;WordPress 站的常見路徑&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals-2026/#%E5%B7%A5%E5%85%B7%E5%B0%8D%E7%85%A7%E8%A1%A8&quot;&gt;工具對照表&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals-2026/#%E5%B8%B8%E8%A6%8B%E8%BF%B7%E6%80%9D&quot;&gt;常見迷思&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals-2026/#%E7%B5%90%E8%AA%9E&quot;&gt;結語&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;PageSpeed-Insights-是什麼&quot;&gt;PageSpeed Insights 是什麼&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt; 是 Google 提供的免費網頁效能檢測工具，輸入網址即可取得：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;實地數據（Field Data）&lt;/strong&gt;：來自 &lt;a href=&quot;https://developer.chrome.com/docs/crux&quot;&gt;Chrome User Experience Report（CrUX）&lt;/a&gt;，反映真實使用者在過去 28 天內的體驗。&lt;li&gt;&lt;strong&gt;實驗室數據（Lab Data）&lt;/strong&gt;：由 Lighthouse 在模擬環境中跑分，適合診斷「為什麼慢」，但不等於搜尋排名依據。&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;重點&lt;/strong&gt;：Google 評估 Core Web Vitals 是否達標，看的是 &lt;strong&gt;實地數據第 75 百分位數（p75）&lt;/strong&gt;，不是 Lighthouse 分數。Lighthouse 90 分但 CrUX 顯示「需要改善」的情況很常見。&lt;h2 id=&quot;Core-Web-Vitals-2026三項指標與門檻&quot;&gt;Core Web Vitals 2026：三項指標與門檻&lt;/h2&gt;&lt;p&gt;2024 年 3 月起，&lt;strong&gt;INP（Interaction to Next Paint）&lt;/strong&gt; 正式取代 FID，成為互動性指標。目前三項 Core Web Vitals 如下：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指標&lt;th&gt;衡量面向&lt;th&gt;良好（Good）&lt;th&gt;需要改善&lt;th&gt;不佳（Poor）&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;LCP&lt;/strong&gt; 最大內容繪製&lt;td&gt;載入速度&lt;td&gt;≤ 2.5 秒&lt;td&gt;2.5–4.0 秒&lt;td&gt;&amp;gt; 4.0 秒&lt;tr&gt;&lt;td&gt;&lt;strong&gt;INP&lt;/strong&gt; 互動至下次繪製&lt;td&gt;互動回應&lt;td&gt;≤ 200 毫秒&lt;td&gt;200–500 毫秒&lt;td&gt;&amp;gt; 500 毫秒&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CLS&lt;/strong&gt; 累積版面位移&lt;td&gt;視覺穩定&lt;td&gt;≤ 0.1&lt;td&gt;0.1–0.25&lt;td&gt;&amp;gt; 0.25&lt;/table&gt;&lt;p&gt;要通過 Core Web Vitals 評估，&lt;strong&gt;三項指標必須同時&lt;/strong&gt;在「良好」門檻內（p75）。任一項落在「需要改善」或「不佳」，整體即視為未通過。&lt;h3 id=&quot;LCP最大內容繪製&quot;&gt;LCP：最大內容繪製&lt;/h3&gt;&lt;p&gt;LCP 測量頁面主要內容（通常是 hero 圖、大標題或主要文字區塊）出現在螢幕上的時間。&lt;p&gt;&lt;strong&gt;常見拖慢原因&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;伺服器回應慢（TTFB 過高）&lt;li&gt;未壓縮或未預載的大圖&lt;li&gt;阻塞渲染的 CSS / JavaScript&lt;li&gt;字型載入延遲&lt;/ul&gt;&lt;p&gt;PSI 近年提供 &lt;strong&gt;LCP 子項目診斷&lt;/strong&gt;（TTFB、資源載入延遲、元素渲染延遲），可快速判斷瓶頸在伺服器還是前端。&lt;h3 id=&quot;INP取代-FID-的互動指標&quot;&gt;INP：取代 FID 的互動指標&lt;/h3&gt;&lt;p&gt;舊版 &lt;strong&gt;FID&lt;/strong&gt; 只量測「第一次」互動的延遲；&lt;strong&gt;INP&lt;/strong&gt; 則看頁面上&lt;strong&gt;所有互動&lt;/strong&gt;中最慢的一次，更能反映整體操作流暢度。&lt;p&gt;&lt;strong&gt;常見拖慢原因&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;過多或過大的 JavaScript（長任務 &amp;gt; 50ms）&lt;li&gt;第三方腳本（廣告、追蹤、聊天外掛）&lt;li&gt;主執行緒被同步運算佔用&lt;/ul&gt;&lt;p&gt;診斷建議：用 Chrome DevTools → Performance 錄製，在手機模擬模式下點擊選單、按鈕、表單，找出最慢的互動。&lt;h3 id=&quot;CLS累積版面位移&quot;&gt;CLS：累積版面位移&lt;/h3&gt;&lt;p&gt;CLS 衡量版面在載入過程中「意外跳動」的程度，例如廣告插入、圖片沒預留高度、字型切換（FOIT/FOUT）。&lt;p&gt;&lt;strong&gt;修正方向&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;圖片與影片設定 &lt;code&gt;width&lt;/code&gt; / &lt;code&gt;height&lt;/code&gt; 或 &lt;code&gt;aspect-ratio&lt;/code&gt;&lt;li&gt;廣告與嵌入內容預留固定空間&lt;li&gt;使用 &lt;code&gt;font-display: swap&lt;/code&gt; 並搭配相近的 fallback 字型&lt;/ul&gt;&lt;h2 id=&quot;實地數據-vs-Lighthouse該信哪個&quot;&gt;實地數據 vs Lighthouse：該信哪個&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;th&gt;實地數據（CrUX）&lt;th&gt;實驗室數據（Lighthouse）&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;資料來源&lt;td&gt;真實 Chrome 使用者&lt;td&gt;模擬裝置與網路&lt;tr&gt;&lt;td&gt;用途&lt;td&gt;判斷是否達 CWV 門檻&lt;td&gt;找出具體優化項目&lt;tr&gt;&lt;td&gt;更新頻率&lt;td&gt;約 28 天滾動窗口&lt;td&gt;每次重新分析即時&lt;tr&gt;&lt;td&gt;新站 / 低流量站&lt;td&gt;可能顯示「沒有足夠資料」&lt;td&gt;仍可取得分數&lt;/table&gt;&lt;p&gt;&lt;strong&gt;實務流程&lt;/strong&gt;：&lt;ol&gt;&lt;li&gt;先看 Search Console →「體驗」→ Core Web Vitals 報表（整站概況）。&lt;li&gt;對問題 URL 跑 PSI，確認實地數據哪一項未達標。&lt;li&gt;往下捲看 Lighthouse「診斷」與「建議」，逐項修復。&lt;li&gt;部署後等待 CrUX 更新（通常需數週）再驗證。&lt;/ol&gt;&lt;h2 id=&quot;30-分鐘優化-Checklist&quot;&gt;30 分鐘優化 Checklist&lt;/h2&gt;&lt;p&gt;依影響力由高到低排列，適合多數內容型網站：&lt;h3 id=&quot;伺服器與快取優先&quot;&gt;伺服器與快取（優先）&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;[ ] 啟用 HTTPS 與 HTTP/2 / HTTP/3&lt;li&gt;[ ] 使用 CDN 或邊緣快取&lt;li&gt;[ ] WordPress 站：啟用全頁快取（LiteSpeed Cache、WP Rocket 或主機內建快取）&lt;li&gt;[ ] 靜態站：確認託管商有邊緣快取（如 Cloudflare、Netlify）&lt;/ul&gt;&lt;h3 id=&quot;圖片與字型&quot;&gt;圖片與字型&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;[ ] 轉換為 WebP / AVIF，並設定適當尺寸&lt;li&gt;[ ] 對 LCP 圖片使用 &lt;code&gt;&amp;lt;link rel=&amp;quot;preload&amp;quot;&amp;gt;&lt;/code&gt;&lt;li&gt;[ ] 字型子集化，避免載入整個字型家族&lt;/ul&gt;&lt;h3 id=&quot;JavaScript-與-CSS&quot;&gt;JavaScript 與 CSS&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;[ ] 延遲載入非關鍵 JS（&lt;code&gt;defer&lt;/code&gt; / &lt;code&gt;async&lt;/code&gt;）&lt;li&gt;[ ] 移除未使用的 CSS 與外掛腳本&lt;li&gt;[ ] 審查第三方腳本（GA、廣告、社群外掛）&lt;/ul&gt;&lt;h3 id=&quot;版面穩定&quot;&gt;版面穩定&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;[ ] 所有媒體元素預留尺寸&lt;li&gt;[ ] 避免在首屏上方動態插入橫幅&lt;/ul&gt;&lt;h2 id=&quot;WordPress-站的常見路徑&quot;&gt;WordPress 站的常見路徑&lt;/h2&gt;&lt;p&gt;若你使用 WordPress，效能優化通常分三層：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;主機&lt;/strong&gt;：優先選支援 HTTP/2／HTTP/3、物件快取，或 LiteSpeed／同等高效 Web Server 的方案。&lt;li&gt;&lt;strong&gt;快取外掛&lt;/strong&gt;：全頁快取、圖片 WebP／延遲載入、CSS／JS 延遲；Guest Mode 類功能可加速未登入訪客。&lt;li&gt;&lt;strong&gt;內容&lt;/strong&gt;：精簡外掛、媒體庫定期清理「尚無關聯」圖檔（先備份）、避免首屏塞過多第三方腳本。&lt;/ol&gt;&lt;p&gt;若考慮脫離 WordPress 的維護成本，可參考 &lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/&quot;&gt;WordPress vs Eleventy&lt;/a&gt; 的遷移經驗——靜態站天生在 LCP 與 INP 上有結構優勢。遷移內容時可用 &lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/&quot;&gt;eleventy-import&lt;/a&gt;（或先從 WP 匯出 WXR 再轉換）。&lt;h3 id=&quot;轉址與重複內容簡記&quot;&gt;轉址與重複內容（簡記）&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;改版或刪文後，用主機 Redirects／&lt;code&gt;.htaccess&lt;/code&gt; 做 &lt;strong&gt;301&lt;/strong&gt;，避免 404 流失權重。&lt;li&gt;多篇搶同一關鍵字時，合併成一篇支柱文並把舊 URL 301 過來，比硬留薄文更有效。&lt;/ul&gt;&lt;h2 id=&quot;工具對照表&quot;&gt;工具對照表&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;th&gt;類型&lt;th&gt;適合用途&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt;&lt;td&gt;實地 + 實驗室&lt;td&gt;單頁快速檢測&lt;tr&gt;&lt;td&gt;Google Search Console&lt;td&gt;實地（整站）&lt;td&gt;監控通過率與問題 URL&lt;tr&gt;&lt;td&gt;Chrome DevTools → Performance&lt;td&gt;實驗室&lt;td&gt;深入追蹤 INP / 長任務&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/GoogleChrome/web-vitals&quot;&gt;web-vitals&lt;/a&gt; JS 函式庫&lt;td&gt;自訂 RUM&lt;td&gt;送 GA4 做長期監控&lt;/table&gt;&lt;h2 id=&quot;常見迷思&quot;&gt;常見迷思&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q：Lighthouse 滿分就代表 SEO 沒問題？&lt;/strong&gt;&lt;br&gt;A：不一定。Lighthouse 是實驗室環境；排名相關的是 CrUX 實地數據。兩者都要看。&lt;p&gt;&lt;strong&gt;Q：FID 還會出現在 PSI 嗎？&lt;/strong&gt;&lt;br&gt;A：部分舊報表或診斷可能仍提及 FID，但 &lt;strong&gt;Core Web Vitals 評估已改用 INP&lt;/strong&gt;。優化時以 INP 為準。&lt;p&gt;&lt;strong&gt;Q：新站沒有 CrUX 資料怎麼辦？&lt;/strong&gt;&lt;br&gt;A：先用 Lighthouse 修到合理分數，上線累積流量後再依 Search Console 調整。流量極低的頁面可能長期沒有實地數據，這是正常現象。&lt;p&gt;&lt;strong&gt;Q：改完多久才會在 PSI 看到改善？&lt;/strong&gt;&lt;br&gt;A：Lighthouse 即時反映；CrUX 實地數據通常需 &lt;strong&gt;數週&lt;/strong&gt; 才會更新。&lt;h2 id=&quot;結語&quot;&gt;結語&lt;/h2&gt;&lt;p&gt;2026 年解讀 PageSpeed Insights 的關鍵字是：&lt;strong&gt;實地數據優先、INP 取代 FID、三項同時達標&lt;/strong&gt;。先把 LCP 與伺服器/快取处理好，再處理 JavaScript 對 INP 的影響，最後補 CLS 的版面預留——這個順序在多數部落格與內容站上最省時間。&lt;p&gt;若你的 WordPress 站 LCP 長期卡在「需要改善」，先從主機快取與圖片著手；若已考慮遷移靜態站，本站 &lt;a href=&quot;https://kamadiam.com/11ty-generator/&quot;&gt;11ty 入門教學&lt;/a&gt; 可作為下一步參考。</content>
  </entry>
  <entry>
    <title>把文章從 WordPress 搬出來：eleventy-import 的匯出方式</title>
    <link href="https://kamadiam.com/11ty-import-tutorial/" />
    <updated>2025-12-15T10:00:00Z</updated>
    <id>https://kamadiam.com/11ty-import-tutorial/</id>
    <content type="html">&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#eleventy-import,%E7%B5%82%E6%96%BC%E5%8F%AF%E4%BB%A5%E6%8A%8A-WordPress-%E8%B3%87%E6%96%99%E5%A5%BD%E5%A5%BD%E6%90%AC%E5%87%BA%E4%BE%86&quot;&gt;eleventy-import，終於可以把 WordPress 資料好好搬出來&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E5%AE%98%E6%96%B9%E5%87%BA%E6%89%8B11ty-%E7%9A%84-WordPress-%E8%BD%89%E7%A7%BB%E6%95%99%E5%AD%B8&quot;&gt;官方出手：11ty 的 WordPress 轉移教學&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E4%BD%BF%E7%94%A8-eleventy-import-%E5%8C%AF%E5%87%BA-WordPress-%E6%96%87%E7%AB%A0&quot;&gt;使用 eleventy-import 匯出 WordPress 文章&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E5%8C%AF%E5%87%BA%E5%BE%8C%E7%9A%84%E7%9B%AE%E9%8C%84%E7%B5%90%E6%A7%8B&quot;&gt;匯出後的目錄結構&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E4%B8%8B%E4%B8%80%E6%AD%A5%E9%81%B8%E6%93%87-11ty-Starter&quot;&gt;下一步：選擇 11ty Starter&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E6%9C%80%E5%BE%8C%E9%81%B8%E6%93%87&quot;&gt;最後選擇&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E5%95%9F%E5%8B%95-11ty,%E9%A9%97%E6%94%B6%E6%88%90%E6%9E%9C&quot;&gt;啟動 11ty，驗收成果&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E5%BE%9E%E9%80%99%E4%B8%80%E5%88%BB%E8%B5%B7,%E6%98%AF%E5%85%A8%E6%96%B0%E7%9A%84%E9%96%8B%E5%A7%8B&quot;&gt;從這一刻起，是全新的開始&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;老實說，&lt;strong&gt;從 WordPress 轉移到其他系統，最痛苦的永遠不是選框架，而是「資料怎麼搬」&lt;/strong&gt;。&lt;p&gt;這點大家應該都心有戚戚焉。&lt;h2 id=&quot;eleventy-import,終於可以把-WordPress-資料好好搬出來&quot;&gt;eleventy-import，終於可以把 WordPress 資料好好搬出來&lt;/h2&gt;&lt;p&gt;11ty 的作者真的很懂這個痛點，直接自己寫了一個官方匯入工具：&lt;strong&gt;eleventy-import&lt;/strong&gt;。&lt;p&gt;在真正遇到它之前，我其實也走過不少冤枉路。&lt;p&gt;一開始的想法很直覺：&lt;p&gt;👉 用 WordPress 外掛把文章匯出成 Markdown，再慢慢整理。&lt;p&gt;問題是——事情完全沒那麼單純。&lt;h3 id=&quot;為什麼一般-WordPress-匯出方式這麼痛苦?&quot;&gt;為什麼一般 WordPress 匯出方式這麼痛苦？&lt;/h3&gt;&lt;p&gt;之前試過幾個 WordPress 匯出外掛，產生出來的檔案大多有這些問題：&lt;ul&gt;&lt;li&gt;夾雜大量 &lt;strong&gt;WordPress 專用標籤&lt;/strong&gt;&lt;li&gt;各種外掛留下來的 &lt;strong&gt;短代碼（shortcode）&lt;/strong&gt;&lt;li&gt;XML / HTML 混在一起，格式不統一&lt;li&gt;有的圖片是外掛語法，還有各種奇怪的包法&lt;/ul&gt;&lt;p&gt;最麻煩的是：&lt;p&gt;👉 &lt;strong&gt;這些雜物沒有固定格式，根本沒辦法用一支 script 全部清乾淨&lt;/strong&gt;&lt;p&gt;每篇文章都像在開盲盒，例外狀況多到讓人直接放棄。&lt;p&gt;於是這件事就這樣被擱著了。&lt;h2 id=&quot;官方出手11ty-的-WordPress-轉移教學&quot;&gt;官方出手：11ty 的 WordPress 轉移教學&lt;/h2&gt;&lt;p&gt;直到有一天，在 11ty 官網亂逛時，看到這一頁：&lt;p&gt;👉 https://www.11ty.dev/docs/migrate/wordpress/&lt;p&gt;不只寫了完整教學，&lt;strong&gt;作者本人還拍了一支影片，標題是「Escape From WordPress」&lt;/strong&gt;，整個就是用意非常明顯 😂&lt;p&gt;影片在這裡：&lt;p&gt;https://www.youtube.com/watch?v=WuH5QYCdh6w&lt;p&gt;看到這裡才發現：&lt;p&gt;👉 原來 11ty 早就把「從 WordPress 逃離」這件事想好了。&lt;hr&gt;&lt;h2 id=&quot;使用-eleventy-import-匯出-WordPress-文章&quot;&gt;&lt;strong&gt;使用 eleventy-import 匯出 WordPress 文章&lt;/strong&gt;&lt;/h2&gt;&lt;h3 id=&quot;直接執行一行指令&quot;&gt;&lt;strong&gt;直接執行一行指令&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;使用方式非常暴力，也非常爽快：&lt;pre&gt;&lt;code&gt;npx @11ty/import wordpress https://your-site.com/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;或者如果習慣 pnpm&lt;pre&gt;&lt;code&gt;pnpm dlx @11ty/import wordpress https://your-site.com/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;第一次看到這行指令的反應是：&lt;blockquote&gt;&lt;p&gt;不是吧？就這樣？&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;沒了？&lt;/blockquote&gt;&lt;p&gt;結果真的就 &lt;strong&gt;完成了，YA。&lt;/strong&gt;&lt;h2 id=&quot;匯出後的目錄結構&quot;&gt;&lt;strong&gt;匯出後的目錄結構&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;eleventy-import 會直接幫你輸出成 &lt;strong&gt;11ty 最愛的格式&lt;/strong&gt;：&lt;pre&gt;&lt;code&gt;your_project/
  assets/
    image1
    image2

  article1.md
  article2.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;幾個我覺得「非常關鍵」的點：&lt;ul&gt;&lt;li&gt;每一篇文章都是 &lt;strong&gt;乾淨的 Markdown&lt;/strong&gt;&lt;li&gt;所有圖片自動整理進 assets/ 目錄&lt;li&gt;文章內的圖片連結也已經幫你改好&lt;li&gt;幾乎沒有 WordPress 遺毒&lt;/ul&gt;&lt;p&gt;一句話總結：&lt;p&gt;👉 &lt;strong&gt;這個輸出結果，完全就是為了「直接丟進 11ty」而設計的。&lt;/strong&gt;&lt;h2 id=&quot;下一步選擇-11ty-Starter&quot;&gt;&lt;strong&gt;下一步：選擇 11ty Starter&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;文章資料已經乾乾淨淨了，接下來就是選一個起始專案。&lt;h3 id=&quot;eleventy-base-blog&quot;&gt;eleventy-base-blog&lt;/h3&gt;&lt;p&gt;GitHub：&lt;p&gt;&lt;a href=&quot;https://github.com/11ty/eleventy-base-blog&quot; target=&quot;_blank&quot;&gt;eleventy-base&lt;/a&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;官方範例，結構清楚&lt;li&gt;幾乎沒有多餘抽象&lt;li&gt;非常適合「想自己慢慢加功能」的人&lt;li&gt;好改、不綁架設計&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;缺點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;功能極簡&lt;li&gt;SEO、樣式、搜尋、圖片優化都要自己補&lt;li&gt;一開始看起來有點「什麼都沒有」&lt;/ul&gt;&lt;h3 id=&quot;eleventy-excellent&quot;&gt;&lt;strong&gt;eleventy-excellent&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;網站：&lt;p&gt;&lt;a href=&quot;https://eleventy-excellent.netlify.app/&quot; target=&quot;_blank&quot;&gt;eleventy-excellent&lt;/a&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;幾乎什麼都幫你準備好了&lt;li&gt;包含 SEO、圖片處理、效能最佳化&lt;li&gt;設計完成度高，很快就能上線&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;缺點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;設計與架構選擇比較多是「作者的想法」&lt;li&gt;想大改時，需要先理解一整套設計哲學&lt;li&gt;對我來說，反而有點太滿了&lt;/ul&gt;&lt;h2 id=&quot;最後選擇&quot;&gt;&lt;strong&gt;最後選擇&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;一開始其實是用 &lt;strong&gt;eleventy-excellent&lt;/strong&gt;，因為真的很省事。&lt;p&gt;但實際調整一陣子後發現：&lt;p&gt;👉 &lt;strong&gt;一定會有一些地方「不是自己想要的方式」&lt;/strong&gt;&lt;p&gt;而要改動那些地方，反而得先拆作者原本的設計。&lt;p&gt;最後決定回頭選擇 &lt;strong&gt;eleventy-base-blog&lt;/strong&gt;：&lt;blockquote&gt;&lt;p&gt;從最簡單的開始，&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;需要什麼，再一個一個加。&lt;/blockquote&gt;&lt;h2 id=&quot;啟動-11ty,驗收成果&quot;&gt;&lt;strong&gt;啟動 11ty，驗收成果&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;把剛剛匯出的文章與 assets 目錄，放進：&lt;pre&gt;&lt;code&gt;content/blog/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後啟動專案：&lt;pre&gt;&lt;code&gt;pnpm run start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;打開瀏覽器，直接進：&lt;pre&gt;&lt;code&gt;http://localhost:8080/文章名稱/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;你會看到一件很神奇的事：&lt;ul&gt;&lt;li&gt;文章內容完整&lt;li&gt;圖片全部正常&lt;li&gt;但樣式幾乎全沒了&lt;/ul&gt;&lt;p&gt;這一刻這是感動萬分！。&lt;p&gt;因為這代表：&lt;p&gt;👉 &lt;strong&gt;資料真的已經完全脫離 WordPress 了。&lt;/strong&gt;&lt;p&gt;若你還在 WordPress 端，也可先用後台「工具 → 匯出」產生 &lt;strong&gt;WXR&lt;/strong&gt;，再轉成 Markdown；本站實務路線是直接用 &lt;code&gt;eleventy-import&lt;/code&gt; 一次帶走文章與圖片。&lt;h2 id=&quot;從這一刻起,是全新的開始&quot;&gt;&lt;strong&gt;從這一刻起，是全新的開始&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;這樣的網站：&lt;ul&gt;&lt;li&gt;快到不行，幾乎是秒開&lt;li&gt;什麼功能都沒有&lt;li&gt;但結構乾淨、可控、沒有包袱&lt;/ul&gt;&lt;p&gt;這就是取捨啊。&lt;p&gt;WordPress 的功能真的很方便，&lt;p&gt;但當你選擇 11ty，簡單也不是壞事。&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;用效能、掌控感，交換即插即用的便利性。&lt;/strong&gt;&lt;/blockquote&gt;&lt;p&gt;接下來，才是真正有趣的地方。我想要網站愈來愈有趣，而不是愈來愈失去興趣。</content>
  </entry>
  <entry>
    <title>WordPress vs Eleventy：我為什麼把部落格遷到 11ty</title>
    <link href="https://kamadiam.com/wordpress-vs-11ty/" />
    <updated>2025-12-08T10:00:00Z</updated>
    <id>https://kamadiam.com/wordpress-vs-11ty/</id>
    <content type="html">&lt;p&gt;WordPress 作為全球最受歡迎的內容管理系統，已經幫助數百萬人建立了自己的網站。然而，近年來靜態網站生成器如 11ty 也逐漸受到開發者和內容創作者的青睞。這兩種工具各有優缺點，選擇哪一個取決於你的需求、技術背景和維護意願。&lt;p&gt;本文將比較 WordPress 與 11ty，從多個面向分析兩者的差異，幫助你做出最適合的選擇。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5%E8%88%87%E5%AE%9A%E4%BD%8D&quot;&gt;基本概念與定位&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E4%B8%BB%E8%A6%81%E5%B7%AE%E7%95%B0%E6%AF%94%E8%BC%83&quot;&gt;主要差異比較&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E9%81%A9%E5%90%88%E7%9A%84%E4%BD%BF%E7%94%A8%E6%83%85%E5%A2%83&quot;&gt;適合的使用情境&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E5%AF%A6%E9%9A%9B%E6%A1%88%E4%BE%8B%E5%88%86%E6%9E%90&quot;&gt;實際案例分析&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E9%81%B7%E7%A7%BB%E8%88%87%E8%BD%89%E6%8F%9B%E8%80%83%E9%87%8F&quot;&gt;遷移與轉換考量&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E7%B5%90%E8%AB%96%E6%B2%92%E6%9C%89%E7%B5%95%E5%B0%8D%E7%9A%84%E3%80%8C%E6%9C%80%E5%A5%BD%E3%80%8D&quot;&gt;結論：沒有絕對的「最好」&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;基本概念與定位&quot;&gt;基本概念與定位&lt;/h2&gt;&lt;h3 id=&quot;WordPress成熟的全功能-CMS&quot;&gt;WordPress：成熟的全功能 CMS&lt;/h3&gt;&lt;p&gt;WordPress 是一個功能完整的內容管理系統，提供完整的後端管理介面、資料庫儲存、動態內容生成等功能。它最初設計為部落格平台，但現在已經演變成一個全功能的 CMS，可以建立任何類型的網站。&lt;h3 id=&quot;11ty現代化的靜態網站生成器&quot;&gt;11ty：現代化的靜態網站生成器&lt;/h3&gt;&lt;p&gt;11ty（Eleventy）是一個以 JavaScript 為基礎的靜態網站生成器。它不依賴資料庫，而是將內容檔案轉換為靜態 HTML 檔案，在建置時生成完整網站。&lt;h2 id=&quot;主要差異比較&quot;&gt;主要差異比較&lt;/h2&gt;&lt;h3 id=&quot;技術架構&quot;&gt;技術架構&lt;/h3&gt;&lt;h4 id=&quot;WordPress-的動態架構&quot;&gt;WordPress 的動態架構&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;資料庫驅動&lt;/strong&gt;：所有內容都儲存在 MySQL/PostgreSQL 等資料庫中&lt;li&gt;&lt;strong&gt;動態生成&lt;/strong&gt;：每次頁面請求時，PHP 會從資料庫提取資料並動態生成 HTML&lt;li&gt;&lt;strong&gt;依賴關係&lt;/strong&gt;：需要 PHP 運行環境、資料庫伺服器、Web 伺服器（如 Apache/Nginx）&lt;/ul&gt;&lt;h4 id=&quot;11ty-的靜態架構&quot;&gt;11ty 的靜態架構&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;檔案驅動&lt;/strong&gt;：內容以 Markdown、HTML 等檔案格式儲存&lt;li&gt;&lt;strong&gt;預先建置&lt;/strong&gt;：在開發階段就生成所有靜態檔案&lt;li&gt;&lt;strong&gt;獨立部署&lt;/strong&gt;：只需要靜態檔案伺服器，無需資料庫或特定運行環境&lt;/ul&gt;&lt;h3 id=&quot;開發體驗&quot;&gt;開發體驗&lt;/h3&gt;&lt;h4 id=&quot;WordPress視覺化編輯優先&quot;&gt;WordPress：視覺化編輯優先&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;所見即所得編輯器&lt;/strong&gt;：古騰堡編輯器讓非技術人員也能輕鬆編輯內容&lt;li&gt;&lt;strong&gt;即時預覽&lt;/strong&gt;：修改後立即在前端看到效果&lt;li&gt;&lt;strong&gt;外掛生態&lt;/strong&gt;：有數萬個外掛可以快速增加功能&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;缺點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;學習曲線&lt;/strong&gt;：雖然編輯簡單，但要客製化主題仍需學習 PHP、WordPress Hook 等&lt;li&gt;&lt;strong&gt;外掛相容性&lt;/strong&gt;：不同外掛間可能衝突，需要花時間測試和調試&lt;/ul&gt;&lt;p&gt;(現代 PHP 和 WordPress 也改善很多開發流程和工具了) 參考： &lt;a href=&quot;https://kamadiam.com/herd-wordpress/&quot;&gt;如何使用 Herd 在本機架設 WordPress 網站&lt;/a&gt;&lt;h4 id=&quot;11ty程式化開發體驗&quot;&gt;11ty：程式化開發體驗&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;版本控制友好&lt;/strong&gt;：所有內容和設定都以檔案形式存在，可以用 Git 完整管理&lt;li&gt;&lt;strong&gt;完全客製化&lt;/strong&gt;：從頭到尾控制每一個細節&lt;li&gt;&lt;strong&gt;現代開發工具鏈&lt;/strong&gt;：可以使用 npm scripts、現代 CSS 框架、模組化 JavaScript&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;缺點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;學習門檻&lt;/strong&gt;：需要基本程式設計知識&lt;li&gt;&lt;strong&gt;建置步驟&lt;/strong&gt;：每次修改都需要重新建置才能看到效果&lt;/ul&gt;&lt;h3 id=&quot;效能表現&quot;&gt;效能表現&lt;/h3&gt;&lt;h4 id=&quot;WordPress需要持續優化&quot;&gt;WordPress：需要持續優化&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;初始載入&lt;/strong&gt;：動態生成內容導致首次載入較慢&lt;li&gt;&lt;strong&gt;快取需求&lt;/strong&gt;：需要安裝快取外掛（如 WP Rocket、LiteSpeed Cache）來改善效能&lt;li&gt;&lt;strong&gt;伺服器負載&lt;/strong&gt;：高流量時需要更多伺服器資源&lt;/ul&gt;&lt;h4 id=&quot;11ty天生高效能&quot;&gt;11ty：天生高效能&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;極快載入&lt;/strong&gt;：純靜態檔案，CDN 快取效果極佳&lt;li&gt;&lt;strong&gt;低伺服器成本&lt;/strong&gt;：可以使用免費的靜態託管服務&lt;li&gt;&lt;strong&gt;無資料庫查詢&lt;/strong&gt;：沒有資料庫延遲問題&lt;/ul&gt;&lt;p&gt;在相同的機器規格上，11ty會消耗較少資源，也不需要資料庫的建置，但你也可以購買專用主機，直接提升效能。&lt;h3 id=&quot;安全性考量&quot;&gt;安全性考量&lt;/h3&gt;&lt;h4 id=&quot;WordPress常見攻擊目標&quot;&gt;WordPress：常見攻擊目標&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;風險點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;外掛漏洞&lt;/strong&gt;：許多安全性問題來自過時或有漏洞的外掛&lt;li&gt;&lt;strong&gt;PHP 環境&lt;/strong&gt;：動態執行的本質帶來更多攻擊面&lt;li&gt;&lt;strong&gt;資料庫安全&lt;/strong&gt;：需要保護資料庫免於攻擊&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;活躍社群&lt;/strong&gt;：有大量安全性外掛和監控工具&lt;li&gt;&lt;strong&gt;定期更新&lt;/strong&gt;：核心系統和外掛都會定期修補漏洞&lt;/ul&gt;&lt;h4 id=&quot;11ty本質安全&quot;&gt;11ty：本質安全&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;最小攻擊面&lt;/strong&gt;：沒有資料庫、沒有動態執行，極難被入侵&lt;li&gt;&lt;strong&gt;內容驗證&lt;/strong&gt;：建置時可以驗證所有內容和程式碼&lt;li&gt;&lt;strong&gt;相依性控制&lt;/strong&gt;：可以精確控制所有第三方程式庫&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;考量點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;建置安全&lt;/strong&gt;：需要保護建置過程和部署金鑰&lt;li&gt;&lt;strong&gt;第三方服務&lt;/strong&gt;：如果整合外部服務（如表單、評論），需要注意這些服務的安全性&lt;/ul&gt;&lt;p&gt;11ty 的好處是沒有後台登入功能，會被破解的地方就是主機本身，如果主機使用不夠安全，用什麼架構都一樣不安全。&lt;h3 id=&quot;維護成本與複雜度&quot;&gt;維護成本與複雜度&lt;/h3&gt;&lt;h4 id=&quot;WordPress持續維護需求高&quot;&gt;WordPress：持續維護需求高&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;定期任務：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;軟體更新&lt;/strong&gt;：核心、主題、外掛都需要定期更新&lt;li&gt;&lt;strong&gt;安全性修補&lt;/strong&gt;：監控並修補已知漏洞&lt;li&gt;&lt;strong&gt;效能優化&lt;/strong&gt;：定期檢查和優化網站速度&lt;li&gt;&lt;strong&gt;備份管理&lt;/strong&gt;：資料庫和檔案的備份策略&lt;/ul&gt;&lt;p&gt;雖然都很簡單的定期更新，就是很繁雜，但外掛版本和 WordPress 版本和 PHP 版本之間的相容性需要考量。&lt;h4 id=&quot;11ty一次性設定,長期穩定&quot;&gt;11ty：一次性設定，長期穩定&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;維護內容：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;內容更新&lt;/strong&gt;：只需要編輯 Markdown 檔案&lt;li&gt;&lt;strong&gt;相依性更新&lt;/strong&gt;：偶爾更新 npm 套件&lt;li&gt;&lt;strong&gt;重新部署&lt;/strong&gt;：修改後重新建置和部署&lt;/ul&gt;&lt;h3 id=&quot;內容管理與協作&quot;&gt;內容管理與協作&lt;/h3&gt;&lt;h4 id=&quot;WordPress多人協作友好&quot;&gt;WordPress：多人協作友好&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;角色權限系統&lt;/strong&gt;：支援不同層級的使用者權限&lt;li&gt;&lt;strong&gt;即時協作&lt;/strong&gt;：多個編輯者可以同時工作&lt;li&gt;&lt;strong&gt;審核流程&lt;/strong&gt;：支援草稿、審核、發布流程&lt;/ul&gt;&lt;p&gt;以我個人的情境來說（主要是一人維護與發文），WordPress 的角色權限與協作流程屬於「用得到很強，用不到就比較像是額外的系統功能」。相對地，我更在意的是內容變更是否能被精準追蹤與回溯。&lt;p&gt;而且你也很難追蹤另一個 WordPress 使用者動了什麼東西，改了什麼設定。&lt;h4 id=&quot;11ty開發者導向協作&quot;&gt;11ty：開發者導向協作&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Git 工作流程&lt;/strong&gt;：任何微小變動都清清楚楚，輕易追蹤管理版本。&lt;li&gt;&lt;strong&gt;內容即程式碼&lt;/strong&gt;：內容和程式碼使用相同工具管理&lt;li&gt;&lt;strong&gt;版本歷史&lt;/strong&gt;：完整的內容修改歷史記錄&lt;/ul&gt;&lt;h2 id=&quot;適合的使用情境&quot;&gt;適合的使用情境&lt;/h2&gt;&lt;h3 id=&quot;選擇-WordPress-的情境&quot;&gt;選擇 WordPress 的情境&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;非技術使用者&lt;/strong&gt;：如果你不熟悉程式設計，但需要快速建立網站&lt;li&gt;&lt;strong&gt;複雜功能需求&lt;/strong&gt;：需要會員系統、電子商務、複雜表單等動態功能&lt;li&gt;&lt;strong&gt;多人協作內容&lt;/strong&gt;：有多個內容編輯者，需要完善的權限管理&lt;li&gt;&lt;strong&gt;預算有限&lt;/strong&gt;：不想花時間學習技術，希望快速上線&lt;li&gt;&lt;strong&gt;經常變更內容&lt;/strong&gt;：網站內容需要頻繁更新，希望即時生效&lt;/ol&gt;&lt;h3 id=&quot;選擇-11ty-的情境&quot;&gt;選擇 11ty 的情境&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;技術背景使用者&lt;/strong&gt;：熟悉 HTML、CSS、JavaScript，有程式設計基礎&lt;li&gt;&lt;strong&gt;效能至上&lt;/strong&gt;：對網站載入速度有極高要求&lt;li&gt;&lt;strong&gt;安全性重視&lt;/strong&gt;：希望最小化安全風險&lt;li&gt;&lt;strong&gt;長期維護考量&lt;/strong&gt;：希望降低長期維護成本&lt;li&gt;&lt;strong&gt;個人/小型專案&lt;/strong&gt;：部落格、作品集、文件網站等&lt;li&gt;&lt;strong&gt;版本控制需求&lt;/strong&gt;：需要完整的內容版本歷史和協作流程&lt;/ol&gt;&lt;p&gt;這些只是比較適合的點，並不代表這個功能一定得用某個技術才行。&lt;h2 id=&quot;實際案例分析&quot;&gt;實際案例分析&lt;/h2&gt;&lt;h3 id=&quot;WordPress-適合案例&quot;&gt;WordPress 適合案例&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;新聞網站&lt;/strong&gt;：需要頻繁更新內容、多個編輯者協作&lt;li&gt;&lt;strong&gt;企業網站&lt;/strong&gt;：需要 CMS 整合、聯絡表單、會員系統&lt;li&gt;&lt;strong&gt;電子商務&lt;/strong&gt;：需要購物車、付款閘道、庫存管理&lt;li&gt;&lt;strong&gt;社群平台&lt;/strong&gt;：需要用戶生成內容、評論系統&lt;/ul&gt;&lt;h3 id=&quot;11ty-適合案例&quot;&gt;11ty 適合案例&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;個人部落格&lt;/strong&gt;：內容創作者專注於寫作而非維護&lt;li&gt;&lt;strong&gt;產品文件&lt;/strong&gt;：技術文件、API 文件等需要版本控制&lt;li&gt;&lt;strong&gt;作品集網站&lt;/strong&gt;：設計師、開發者的個人展示網站&lt;li&gt;&lt;strong&gt;公司官網&lt;/strong&gt;：簡單的企業介紹頁面，重視品牌形象&lt;/ul&gt;&lt;p&gt;事實上 11ty 能做的事，WordPress 都做得到，但選擇 11ty 通常不是太功能上的選擇，很多是想在技術上架構上簡單透明一點。&lt;h2 id=&quot;遷移與轉換考量&quot;&gt;遷移與轉換考量&lt;/h2&gt;&lt;h3 id=&quot;從-WordPress-遷移到-11ty&quot;&gt;從 WordPress 遷移到 11ty&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;大幅改善效能和安全性&lt;li&gt;降低託管成本&lt;li&gt;獲得更多控制權&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;挑戰：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;需要將動態功能改為靜態或外部服務&lt;li&gt;失去所見即所得編輯體驗&lt;li&gt;需要學習新的工作流程&lt;/ul&gt;&lt;h3 id=&quot;從-11ty-遷移到-WordPress&quot;&gt;從 11ty 遷移到 WordPress&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;快速增加複雜功能&lt;li&gt;降低內容編輯門檻&lt;li&gt;支援更多非技術使用者&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;挑戰：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;效能下降&lt;li&gt;維護複雜度增加&lt;li&gt;安全性風險提高&lt;/ul&gt;&lt;h2 id=&quot;結論沒有絕對的「最好」&quot;&gt;結論：沒有絕對的「最好」&lt;/h2&gt;&lt;p&gt;WordPress 和 11ty 代表兩種不同的網站建置哲學：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;WordPress&lt;/strong&gt; 強調易用性和功能完整性，適合需要快速上線、複雜功能、或多人協作的專案&lt;li&gt;&lt;strong&gt;11ty&lt;/strong&gt; 強調效能、安全性和開發體驗，適合技術背景的使用者和重視長期維護的專案&lt;/ul&gt;&lt;p&gt;最終的選擇應該基於：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;你的技術能力&lt;/strong&gt;：熟悉程式設計嗎？&lt;li&gt;&lt;strong&gt;專案需求&lt;/strong&gt;：需要哪些功能？預算多少？&lt;li&gt;&lt;strong&gt;維護意願&lt;/strong&gt;：願意投入多少時間在網站維護上？&lt;li&gt;&lt;strong&gt;成長規劃&lt;/strong&gt;：網站未來可能如何演變？&lt;/ol&gt;&lt;p&gt;建議你可以先評估自己的需求，必要時甚至可以考慮混合使用兩者。例如，使用 11ty 建立主要內容網站，WordPress 作為後台內容管理系統。&lt;p&gt;無論選擇哪一個工具，重點是找到最適合自己工作流程和需求的解決方案。技術工具應該服務於內容創作，而不是成為創作的障礙。&lt;p&gt;WordPress 看很多了，來看看幾個 11ty 的網站&lt;ul&gt;&lt;li&gt;https://chrisburnell.com/&lt;li&gt;https://www.zachleat.com/&lt;li&gt;https://eleventy-excellent.netlify.app/&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;相關資源：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.11ty.dev/&quot;&gt;11ty 官方文件&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://wordpress.org/&quot;&gt;WordPress 官方網站&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://jamstack.org/generators/&quot;&gt;靜態網站生成器比較&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://www.netlify.com/blog/2020/04/14/what-is-a-static-site-generator-and-3-ways-to-find-the-best-one/&quot;&gt;What is a Static Site Generator? And 3 ways to find the best one&lt;/a&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>YouTube 批量取消訂閱：一鍵清理訂閱清單教學</title>
    <link href="https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/" />
    <updated>2023-12-22T18:40:39Z</updated>
    <id>https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/</id>
    <content type="html">&lt;p&gt;這篇文章將帶領大家透過一個實際案例，使用 Google YouTube API、OAuth、Svelte 和 TailwindCSS 建立一個簡單、方便的工具來批量取消訂閱 YouTube 頻道。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E5%8E%9F%E5%9B%A0&quot;&gt;原因&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E9%96%8B%E7%99%BC%E8%A8%88%E7%95%AB&quot;&gt;開發計畫&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E6%BA%96%E5%82%99-Google-API&quot;&gt;準備 Google API&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#SvelteKit-%E5%88%9D%E5%A7%8B%E5%B0%88%E6%A1%88&quot;&gt;SvelteKit 初始專案&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#TailwindCSS-%E7%BE%8E%E5%8C%96%E4%BB%8B%E9%9D%A2&quot;&gt;TailwindCSS 美化介面&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E7%AC%AC%E4%B8%80%E5%80%8B%E7%95%AB%E9%9D%A2&quot;&gt;第一個畫面&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E9%A0%BB%E9%81%93%E7%AE%A1%E7%90%86%E4%BB%8B%E9%9D%A2&quot;&gt;頻道管理介面&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E5%AF%A6%E9%9A%9B%E6%B8%AC%E8%A9%A6%E7%95%AB%E9%9D%A2&quot;&gt;實際測試畫面&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E5%A6%82%E4%BD%95%E6%A7%8B%E5%BB%BA%E8%88%87%E7%99%BC%E5%B8%83&quot;&gt;如何構建與發布&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;原因&quot;&gt;原因&lt;/h2&gt;&lt;p&gt;像我這樣，訂閱了上百個 YouTube 頻道，卻發現大多數時間都在滑過不看的內容，這不僅分散注意力，也減少了尋找有趣內容的效率。&lt;p&gt;土法煉鋼一個一個點頻道退訂，大概退了一二十個頻道後，終於還是受不了，這樣點真的很累。YouTube 的管理介面對於批量操作真不友好，搜尋很多網路解法，並沒有找到方便好用又快速的方式。&lt;p&gt;不如自己來寫個工具，構想大概就用個簡單頁面顯示我的訂閱，然後使用 YouTube API 刪除挑選的訂閱。查看一下 Google 文件，果然有簡單的 API 可以用，那就開始吧。&lt;p&gt;&lt;a href=&quot;https://developers.google.com/youtube/v3/docs/subscriptions&quot;&gt;參考 Subscriptions API&lt;/a&gt;&lt;h2 id=&quot;開發計畫&quot;&gt;開發計畫&lt;/h2&gt;&lt;p&gt;任何開發計畫第一件事，一定是把本機開發環境弄好，讓開發節奏順暢。&lt;p&gt;預計使用 SvelteKit 開發一個純網頁的前端應用，不需要後端 Server，只需要能呼叫 YouTube API 就行。&lt;p&gt;應該會需要使用 OAuth 授權，才能取得訂閱頻道清單。&lt;p&gt;畫面要簡單也不能太醜，&lt;a href=&quot;https://tailwindcss.com/&quot;&gt;TailwindCSS&lt;/a&gt; 能快速解決。&lt;h2 id=&quot;準備-Google-API&quot;&gt;準備 Google API&lt;/h2&gt;&lt;p&gt;要使用 Google API，首先需要在 &lt;a href=&quot;https://cloud.google.com/&quot;&gt;Google Cloud Platform&lt;/a&gt; 上建立一個新的專案，然後在該專案中啟用 YouTube Data API v3。&lt;h3 id=&quot;建立新專案&quot;&gt;建立新專案&lt;/h3&gt;&lt;h4 id=&quot;登入-Google-Cloud-Console,建立一個新專案&quot;&gt;登入 Google Cloud Console，建立一個新專案。&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/Pasted-image-20231223072504-1h8aFPKwV1EZ.png&quot; alt=&quot;&quot;&gt;&lt;h4 id=&quot;在建立的專案中,導航到「API-與服務」&gt;「啟用-API-和服務」&quot;&gt;在建立的專案中，導航到「API 與服務」&amp;gt;「啟用 API 和服務」。&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/Pasted-image-20231223072159-KyjClkEXGEhl.png&quot; alt=&quot;&quot;&gt;&lt;h4 id=&quot;搜尋並選擇「YouTube-Data-API-v3」,然後啟用它&quot;&gt;搜尋並選擇「YouTube Data API v3」，然後啟用它。&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/Pasted-image-20231222221257-20-wt203NPBa2eD.png&quot; alt=&quot;&quot;&gt;&lt;h3 id=&quot;OAuth-設定&quot;&gt;OAuth 設定&lt;/h3&gt;&lt;h4 id=&quot;在相同的專案中,建立憑證,以便存取已啟用的-API&quot;&gt;在相同的專案中，建立憑證，以便存取已啟用的 API。&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/Pasted-image-20231222221501-20-iiO2nwkkKvou.png&quot; alt=&quot;&quot;&gt;&lt;h4 id=&quot;設置-OAuth-同意畫面,提供必要的應用資訊&quot;&gt;設置 OAuth 同意畫面，提供必要的應用資訊。&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/Pasted-image-20231222222201-qJ1NOmjEoDya.png&quot; alt=&quot;&quot;&gt;&lt;h4 id=&quot;在-OAuth-用戶端設置中,新增授權的重定向-URI,這將用於-OAuth-流程&quot;&gt;在 OAuth 用戶端設置中，新增授權的重定向 URI，這將用於 OAuth 流程。&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/Pasted-image-20231222221732-76-o0gnJGYK41HG.png&quot; alt=&quot;&quot;&gt;&lt;p&gt;這是本機的測試 callback 網址，可以新增 URI 分別對應不同執行環境。&lt;p&gt;這個專案需要額外授權，所以需要經過 Google 審核，不然就只能自己使用，或者設定測試人員，分享給別人使用，最多 100 個人。&lt;h2 id=&quot;SvelteKit-初始專案&quot;&gt;SvelteKit 初始專案&lt;/h2&gt;&lt;p&gt;使用以下命令來建立一個新的 SvelteKit 專案：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; create svelte@latest youtube-app&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這將建立一個基礎的 SvelteKit 專案，你可以開始新增自己的程式碼。&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;code &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用 Visual Studio Code 開啟專案。&lt;h2 id=&quot;TailwindCSS-美化介面&quot;&gt;TailwindCSS 美化介面&lt;/h2&gt;&lt;p&gt;為了快速而美觀地構建 UI，這裡將使用 TailwindCSS。以下是整合 TailwindCSS 的步驟：&lt;p&gt;安裝 tailwindcss 及其相關依賴項目：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; tailwindcss postcss autoprefixer&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後產生 tailwind.config.js 和 postcss.config.js 檔案：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; dlx tailwindcss init &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安裝 DaisyUI（一個基於 Tailwind 的組件庫）：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; i &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; daisyui@latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;修改 svelte.config.js&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;import adapter from &lt;span class=&quot;token string&quot;&gt;&#39;@sveltejs/adapter-auto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; vitePreprocess &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; from &lt;span class=&quot;token string&quot;&gt;&#39;@sveltejs/vite-plugin-svelte&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/** @type {import(&#39;@sveltejs/kit&#39;).Config} */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;const config =&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;kit:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;preprocess&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;vitePreprocess&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
export default config&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;修改 tailwind.config.js&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/** @type {import(&#39;tailwindcss&#39;).Config} */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;./src/**/*.{html,js,svelte,ts}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;daisyui&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;建立一個 &lt;code&gt;./src/app.css&lt;/code&gt; 檔案&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;@tailwind base&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
@tailwind components&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
@tailwind utilities&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;建立 &lt;code&gt;./src/routes/+layout.svelte&lt;/code&gt; 檔案並匯入新建立的 app.css 檔案：&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;../app.css&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;slot&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;https://tailwindcss.com/docs/guides/sveltekit&quot;&gt;參考教學來源&lt;/a&gt;&lt;h2 id=&quot;第一個畫面&quot;&gt;第一個畫面&lt;/h2&gt;&lt;p&gt;萬事俱備，先啟動 Server 看看&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; dev&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/Pasted-image-20231222222952-5YlEpTwfrdLY.png&quot; alt=&quot;&quot;&gt;&lt;p&gt;接下來建立一個簡單的登入頁面，允許使用者透過 Google 認證來登入。使用剛剛設定的 OAuth 設定來實現這一點。&lt;p&gt;修改 ./src/routes/+page.svelte&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ts&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token comment&quot;&gt;// 重定向 URI, 在 OAuth 驗證流程中使用&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; redirect_uri &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;http://localhost:5173/oauth2callback&#39;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// 替換你自己的 client_id&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; client_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;your_client_id&#39;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/*
   * 創建表單以從 Google 的 OAuth 2.0 伺服器請求 access token。
   */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;oauthSignIn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Google 的 OAuth 2.0 端點，用於請求 access token&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; oauth2Endpoint &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://accounts.google.com/o/oauth2/v2/auth&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 創建 &amp;lt;form&gt; 元素，提交參數到 OAuth 2.0 端點。&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; form &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;form&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;method&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GET&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 以 GET 請求發送。&lt;/span&gt;
    form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oauth2Endpoint&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Params&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; string&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; string&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 傳遞給 OAuth 2.0 端點的參數。&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Params &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      client_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      redirect_uri&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;response_type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;token&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://www.googleapis.com/auth/youtubepartner&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 將表單參數添加為隱藏的輸入值。&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; p &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; input &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;input&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hidden&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 將表單添加到頁面並提交，以打開 OAuth 2.0 端點。&lt;/span&gt;
    document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;form&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-3xl m-4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Mass Unsubscribe YouTube&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;btn btn-warning&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;on:&lt;/span&gt;click&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;{oauthSignIn}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;使用 Google 帳號登入&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;頻道管理介面&quot;&gt;頻道管理介面&lt;/h2&gt;&lt;p&gt;接下來將新增一個頁面來展示使用者的 YouTube 頻道訂閱列表，並允許他們選擇要取消訂閱的頻道。&lt;p&gt;修改 ./src/routes/oauth2callback/+page.svelte&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ts&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; onMount &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;svelte&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; page &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;$app/stores&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 從 URL 字串中解析出存取令牌&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getAccessTokenFromString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; regex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;#access_token=([^&amp;amp;]*)&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; match &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;regex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; match &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; match&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 取得當前頁面 URL 的存取令牌&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; accessToken &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getAccessTokenFromString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hash&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 這裡放置你的 API 金鑰&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; key &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;key&#39;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 存放訂閱頻道的陣列&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;subscriptions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; any&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 頁面載入時執行&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;onMount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 從 YouTube API 取得訂閱頻道&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://youtube.googleapis.com/youtube/v3/subscriptions?part=snippet&amp;amp;mine=true&amp;amp;key=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;key&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;amp;maxResults=50&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GET&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bearer &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; accessToken&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        subscriptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        subscriptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;subscriptions&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nextPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nextPageToken&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 處理分頁，取得更多訂閱頻道&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nextPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;token&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;token&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://youtube.googleapis.com/youtube/v3/subscriptions?part=snippet&amp;amp;mine=true&amp;amp;key=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;key&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;amp;maxResults=50&amp;amp;pageToken=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;token&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GET&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bearer &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; accessToken&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          subscriptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          subscriptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;subscriptions&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nextPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nextPageToken&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 取消訂閱指定的頻道&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;unsubscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://youtube.googleapis.com/youtube/v3/subscriptions?id=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;id&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;DELETE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bearer &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; accessToken&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;204&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            subscriptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; subscriptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; sub&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 取消訂閱所有頻道&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;unsubscribeAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;confirm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Do you really want to unsubscribe all channels?&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      subscriptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;unsubscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sub&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;unsubscribe &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;sub&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;snippet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-center text-4xl mt-4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;You have {subscriptions.length} subscriptions&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

    {#each subscriptions as sub}
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;m-12 border-2 p-4 flex flex-col&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://www.youtube.com/channel/{sub.snippet.resourceId.channelId}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;_blank&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;self-center&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;{sub.snippet.thumbnails.default.url}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h-24&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; 
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-center text-xl p-2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{sub.snippet.title}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{sub.snippet.description}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &amp;lt;button class=&quot;btn btn-warning mt-2 self-end&quot; on:click={()=&gt;{unsubscribe(sub.id)}}&gt;unsubscribe&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    {/each}

    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;btn btn-error w-full&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;on:&lt;/span&gt;click&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;{unsubscribeAll}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Unsubscribe All&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;目前為止，這個網頁應用已經開發完成。&lt;p&gt;參考教學： &lt;a href=&quot;https://developers.google.com/youtube/v3/guides/auth/client-side-web-apps&quot;&gt;Using OAuth 2.0 for JavaScript Web Applications&lt;/a&gt;&lt;h2 id=&quot;實際測試畫面&quot;&gt;實際測試畫面&lt;/h2&gt;&lt;p&gt;因為這是未發布的測試應用程式，需要加入測試帳號才能使用，或者也可以直接發布，一樣可以進行測試。&lt;h4 id=&quot;新增要測試使用的-google-帳號&quot;&gt;新增要測試使用的 google 帳號&lt;/h4&gt;&lt;p&gt;最多可以新增 100 個。&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/Pasted-image-20231223080011-BFR6PV2Oh1NM.png&quot; alt=&quot;&quot;&gt;&lt;h4 id=&quot;打開本機網址-http//localhost5173/&quot;&gt;打開本機網址 http://localhost:5173/&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/Pasted-image-20231223074646-cHnEWxhv0s5C.png&quot; alt=&quot;&quot;&gt;&lt;h4 id=&quot;選擇帳戶&quot;&gt;選擇帳戶&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/Pasted-image-20231223080609-C6Tlpp9T6k1E.png&quot; alt=&quot;&quot;&gt;&lt;h4 id=&quot;安全驗證&quot;&gt;安全驗證&lt;/h4&gt;&lt;p&gt;尚未經過 Google 驗證，所以會出現警告訊息，保護使用者資料。&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/image-1-04tpAKwdONLa.png&quot; alt=&quot;&quot;&gt;&lt;h4 id=&quot;確認授權&quot;&gt;確認授權&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/image-2-Zc5TPVzSYOs3.png&quot; alt=&quot;&quot;&gt;&lt;h4 id=&quot;查看目前所有訂閱頻道&quot;&gt;查看目前所有訂閱頻道&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/content/img/Pasted-image-20231223081133-o1CM1QzDSRII.png&quot; alt=&quot;&quot;&gt;&lt;p&gt;點擊【unsubscribe】就會直接取消訂閱選擇的頻道。&lt;br&gt;點擊【Unsubscribe All】就會取消訂閱所有的頻道。&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/huihere/youtube-app&quot;&gt;完整程式碼&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/unsubscribe&quot;&gt;測試網頁&lt;/a&gt;&lt;/ul&gt;&lt;h2 id=&quot;如何構建與發布&quot;&gt;如何構建與發布&lt;/h2&gt;&lt;p&gt;待續...</content>
  </entry>
  <entry>
    <title>TypeScript 入門 5 分鐘：零基礎快速上手指南</title>
    <link href="https://kamadiam.com/typescript-getting-started/" />
    <updated>2023-11-26T19:59:54Z</updated>
    <id>https://kamadiam.com/typescript-getting-started/</id>
    <content type="html">&lt;p&gt;歡迎來到 TypeScript 的世界，一個讓 JavaScript 面面俱到的超級英雄！在這篇文章中，我們將一探 TypeScript 的奧秘，並學習如何在 macOS 上搭建開發環境和執行 TypeScript 程式。準備好開始吧！&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/typescript-getting-started/#%E5%A6%82%E4%BD%95%E5%BB%BA%E7%AB%8B-TypeScript-%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83&quot;&gt;如何建立 TypeScript 開發環境&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/typescript-getting-started/#%E5%A6%82%E4%BD%95%E9%81%8B%E8%A1%8C-TypeScript&quot;&gt;如何運行 TypeScript&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;如何建立-TypeScript-開發環境&quot;&gt;如何建立 TypeScript 開發環境&lt;/h2&gt;&lt;p&gt;在 macOS 上搭建 TypeScript 開發環境就像是準備一頓豐盛的晚餐，你需要一些基本的食材和調味料。這裡，我們的食材包括 Node.js 和一個適當的 TypeScript 配置。&lt;h3 id=&quot;安裝-Node.js&quot;&gt;安裝 Node.js&lt;/h3&gt;&lt;p&gt;首先，你需要安裝 Node.js。Node.js 就像是廚房中的烤箱，是執行 JavaScript（和 TypeScript）的基本工具。&lt;ol&gt;&lt;li&gt;前往 &lt;a href=&quot;https://nodejs.org/&quot;&gt;Node.js 官網&lt;/a&gt;。&lt;li&gt;選擇適合 macOS 的版本下載並安裝。&lt;/ol&gt;&lt;p&gt;也許你知道什麼是 Homebrew， 那就簡單了。&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;安裝-TypeScript-Compiler-tsc&quot;&gt;安裝 TypeScript Compiler (tsc)&lt;/h3&gt;&lt;p&gt;&lt;code&gt;tsc&lt;/code&gt; 即 TypeScript 編譯器，是 TypeScript 生態系統中的關鍵工具。TypeScript 編譯器負責將 TypeScript 程式碼（包含型別註釋和現代 JavaScript 特性）轉換成純 JavaScript 程式碼，這樣的程式碼能夠在任何 JavaScript 環境中執行，比如瀏覽器或 Node.js。&lt;p&gt;要使用 &lt;code&gt;tsc&lt;/code&gt;，你通常會透過 Node.js package manager 在全域或在你的專案中本地安裝 TypeScript。&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; typescript &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後運行 &lt;code&gt;tsc&lt;/code&gt; 命令，後跟你想編譯的檔案名稱。例如：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;tsc hello.ts&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以下是 &lt;code&gt;tsc&lt;/code&gt; 的主要功能：&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;編譯&lt;/strong&gt;：&lt;code&gt;tsc&lt;/code&gt; 讀取 TypeScript 檔案（&lt;code&gt;.ts&lt;/code&gt; 或包含 JSX 時的 &lt;code&gt;.tsx&lt;/code&gt;），並輸出 JavaScript 檔案（&lt;code&gt;.js&lt;/code&gt;）。它根據 &lt;code&gt;tsconfig.json&lt;/code&gt; 檔案或命令列參數指定的選項進行編譯&lt;li&gt;&lt;p&gt;&lt;strong&gt;型別檢查&lt;/strong&gt;：在編譯過程中，&lt;code&gt;tsc&lt;/code&gt; 會檢查型別錯誤，如果程式碼不符合指定的型別約束，它將發出警告。這一步對於在開發過程早期捕獲錯誤至關重要&lt;li&gt;&lt;p&gt;&lt;strong&gt;配置&lt;/strong&gt;：您可以使用 &lt;code&gt;tsconfig.json&lt;/code&gt; 檔案對編譯器進行微調，其中包括設定哪些檔案包含在內、編譯到哪個版本的 JavaScript、是否產生來源映射（source maps）以便於除錯等&lt;li&gt;&lt;p&gt;&lt;strong&gt;整合&lt;/strong&gt;：&lt;code&gt;tsc&lt;/code&gt; 可以整合到建置過程中，並得到各種 IDE 的支援，提供即時的錯誤資訊和程式碼編寫回饋&lt;/ul&gt;&lt;h3 id=&quot;初始化-tsconfig&quot;&gt;初始化 tsconfig&lt;/h3&gt;&lt;p&gt;接下來，我們需要初始化 TypeScript 的配置文件 &lt;code&gt;tsconfig.json&lt;/code&gt;。這個文件就像是食譜，告訴 TypeScript 如何處理你的代碼。&lt;p&gt;&lt;code&gt;tsconfig.json&lt;/code&gt; 是 TypeScript 專案的配置檔案，它指導 TypeScript 編譯器（tsc）如何編譯 TypeScript 程式碼。這個檔案允許開發者設定編譯選項，並定義哪些檔案應該被包含或排除在編譯過程之外。&lt;p&gt;打開終端機（Terminal），執行以下命令來初始化 TypeScript 配置：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;tsc &lt;span class=&quot;token parameter variable&quot;&gt;--init&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這會在你的專案目錄中建立一個 &lt;code&gt;tsconfig.json&lt;/code&gt; 檔案。&lt;p&gt;一個基本的 &lt;code&gt;tsconfig.json&lt;/code&gt; 可能看起來像這樣：&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;compilerOptions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;target&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;es5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;module&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;commonjs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;strict&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;outDir&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dist&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這個配置會告訴 TypeScript 編譯器目標是 ES5 版本的 JavaScript，並使用 CommonJS 模組系統。&lt;code&gt;&amp;quot;strict&amp;quot;: true&lt;/code&gt; 開啟所有嚴格的型別檢查選項，確保編譯過程中進行嚴格的型別檢查。&lt;h2 id=&quot;如何運行-TypeScript&quot;&gt;如何運行 TypeScript&lt;/h2&gt;&lt;p&gt;TypeScript 的世界充滿了多種執行程式碼的方式，就像你可以用不同的烹飪方式來準備一道菜。&lt;h3 id=&quot;使用-node&quot;&gt;使用 node&lt;/h3&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/mjw25JAzIw-260.webp 260w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/mjw25JAzIw-260.png&quot; alt=&quot;&quot; width=&quot;260&quot; height=&quot;76&quot;&gt;&lt;/picture&gt;&lt;p&gt;事實上你無法使用 node 直接執行 TypeScript 程式，必須先使用 &lt;code&gt;tsc&lt;/code&gt; 將 TypeScript 編譯成 JavaScript 程式，然後才可以使用 node 執行。&lt;p&gt;首先，安裝 TypeScript：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; typescript &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後，使用 &lt;code&gt;tsc&lt;/code&gt; 編譯你的 TypeScript 文件：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;tsc hello.ts&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這會生成一個 &lt;code&gt;hello.js&lt;/code&gt; 文件。現在，使用 Node.js 運行這個文件：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; hello.js&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;使用-ts-node&quot;&gt;使用 ts-node&lt;/h3&gt;&lt;p&gt;&lt;img src=&quot;https://kamadiam.com/typescript-getting-started/content/img/image-44-MIGPKkDWOCug.png&quot; alt=&quot;&quot;&gt;&lt;p&gt;&lt;code&gt;ts-node&lt;/code&gt; 是一個方便的工具，可以直接執行 TypeScript 程式碼，無需先將其編譯為 JavaScript。這就像是一個即食餐點，快速且方便。&lt;p&gt;安裝 &lt;code&gt;ts-node&lt;/code&gt;：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; ts-node &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後直接執行你的 TypeScript 檔案：&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;ts&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;node hello&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ts&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;TypeScript-Playground&quot;&gt;TypeScript Playground&lt;/h3&gt;&lt;p&gt;如果你不想在本地安裝任何東西，TypeScript Playground 是一個線上沙盒工具，讓你可以寫 TypeScript 並即時看到結果。&lt;p&gt;訪問 &lt;a href=&quot;https://www.typescriptlang.org/play&quot;&gt;TypeScript Playground&lt;/a&gt; 並開始玩轉 TypeScript！&lt;h3 id=&quot;Deno&quot;&gt;Deno&lt;/h3&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/zTuxuQvDXq-300.webp 300w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/zTuxuQvDXq-300.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;116&quot;&gt;&lt;/picture&gt;&lt;p&gt;Deno 是一個現代的 JavaScript/TypeScript 執行環境，內建了很多好玩的特性。它就像是一個高科技廚房，擁有你需要的一切。&lt;p&gt;安裝 Deno：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; deno &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後，編寫你的第一個 TypeScript 程式，並使用 Deno 執行它。&lt;p&gt;Deno 會自動處理 TypeScript 的編譯工作。&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// hello.ts&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello from Deno!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;執行它：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;deno run hello.ts&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;Bun&quot;&gt;Bun&lt;/h3&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/t8mUqWJJcj-300.webp 300w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/t8mUqWJJcj-300.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;116&quot;&gt;&lt;/picture&gt;&lt;p&gt;Bun 是一個新興的 JavaScript 執行環境，專注於效能和開發者體驗。想像一下，一個超級充電的廚房機器人幫助你烹飪！&lt;p&gt;安裝 Bun：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; bun &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;編寫你的 TypeScript 程式：&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// hello.ts&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello from Bun!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用 Bun 執行它：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;bun run hello.ts&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;恭喜你，你已經完成了 TypeScript 的入門課程！現在，你可以開始探索這個強大語言的更多可能性了。記住，編程就像烹飪一樣，要不斷嘗試新的配方和工具。祝你在 TypeScript 的旅程中玩得開心！ 🚀🎉</content>
  </entry>
  <entry>
    <title>PHP 新手入門：10 個實戰練習題快速上手</title>
    <link href="https://kamadiam.com/php-basic-tutorial/" />
    <updated>2023-11-09T04:28:13Z</updated>
    <id>https://kamadiam.com/php-basic-tutorial/</id>
    <content type="html">&lt;p&gt;PHP 程式語法的基礎教學：一步步帶你深入 PHP 的世界，從基礎語法到進階函數，通過每個章節的簡短範例與註解，幫助打造堅實的開發根基。&lt;p&gt;&lt;strong&gt;為什麼要學習 PHP？&lt;/strong&gt;&lt;p&gt;PHP 是一種廣泛使用的伺服器端腳本語言，特別適合網頁開發。它易於學習，功能強大，並且有豐富的社群支援。無論你是想要建立動態網站、開發 Web 應用程式，還是想要進入後端開發領域，PHP 都是一個很好的起點。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-basic-tutorial/#%E5%9F%BA%E6%9C%AC%E8%AA%9E%E6%B3%95&quot;&gt;基本語法&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-basic-tutorial/#%E8%AE%8A%E6%95%B8&quot;&gt;變數&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-basic-tutorial/#%E6%A2%9D%E4%BB%B6%E5%88%A4%E6%96%B7&quot;&gt;條件判斷&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-basic-tutorial/#%E8%BF%B4%E5%9C%88&quot;&gt;迴圈&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-basic-tutorial/#%E9%99%A3%E5%88%97&quot;&gt;陣列&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-basic-tutorial/#%E9%80%B2%E9%9A%8E%E9%99%A3%E5%88%97&quot;&gt;進階陣列&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-basic-tutorial/#%E5%87%BD%E6%95%B8&quot;&gt;函數&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-basic-tutorial/#%E9%80%B2%E9%9A%8E%E5%87%BD%E6%95%B8&quot;&gt;進階函數&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-basic-tutorial/#%E7%B8%BD%E7%B5%90&quot;&gt;總結&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;基本語法&quot;&gt;基本語法&lt;/h2&gt;&lt;h3 id=&quot;PHP-的開始與結束標籤&quot;&gt;PHP 的開始與結束標籤&lt;/h3&gt;&lt;p&gt;PHP 腳本以 &lt;code&gt;&amp;lt;?php&lt;/code&gt; 開始，並以 &lt;code&gt;?&amp;gt;&lt;/code&gt; 結束。如果一個文件完全由 PHP 編寫，則結束標籤可以省略，這有助於避免在輸出中意外添加空格或換行。&lt;p&gt;&lt;strong&gt;最佳實踐：&lt;/strong&gt;&lt;p&gt;在純 PHP 檔案中，建議省略結束標籤 &lt;code&gt;?&amp;gt;&lt;/code&gt;，這樣可以避免在檔案末尾意外輸出空白字元，這些空白字元可能會導致 header 已經發送後無法修改的問題。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 這是 PHP 代碼的開始&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 這是 PHP 代碼的結束&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;如何在網頁中嵌入-PHP-代碼&quot;&gt;如何在網頁中嵌入 PHP 代碼&lt;/h3&gt;&lt;p&gt;PHP 代碼可以嵌入 HTML 文件中，以創建動態內容。PHP 代碼可以放置在 HTML 標籤之間。&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;PHP Test&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?php echo &quot;&amp;lt;p&gt;Hello, World!&amp;lt;/p&gt;&quot;; ?&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;基本的輸出命令echo-與-print&quot;&gt;基本的輸出命令：echo 與 print&lt;/h3&gt;&lt;p&gt;&lt;code&gt;echo&lt;/code&gt; 和 &lt;code&gt;print&lt;/code&gt; 是 PHP 中的兩個基本輸出命令。&lt;code&gt;echo&lt;/code&gt; 是一個語言結構，可以快速輸出一個或多個字符串。&lt;code&gt;print&lt;/code&gt; 也是類似的，但它只能輸出一個字符串，並且始終返回 1。&lt;p&gt;&lt;strong&gt;兩者的差異：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;echo&lt;/code&gt; 可以輸出多個字符串，執行速度稍快&lt;li&gt;&lt;code&gt;print&lt;/code&gt; 只能輸出一個字符串，但可以作為表達式使用（因為它會返回值）&lt;/ul&gt;&lt;p&gt;在實際開發中，&lt;code&gt;echo&lt;/code&gt; 更常被使用，因為它更靈活且執行效率較高。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Hello, &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;World!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出多個字符串&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;I&#39;m about to learn PHP!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出一個字符串&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;註釋的正確使用方法&quot;&gt;註釋的正確使用方法&lt;/h3&gt;&lt;p&gt;註釋是解釋代碼或防止執行代碼的重要工具。PHP 中有單行註釋和多行註釋。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 這是單行註釋&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*
這是多行註釋
可以跨越多行。
*/&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;變數&quot;&gt;變數&lt;/h2&gt;&lt;h3 id=&quot;變數的宣告與命名規則&quot;&gt;變數的宣告與命名規則&lt;/h3&gt;&lt;p&gt;在 PHP 中，所有變數都以 &lt;code&gt;$&lt;/code&gt; 符號開始，其後是變數的名稱。變數名稱必須以字母或下底線開頭，後面可以跟字母、數字或下底線。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$varName&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;John&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 正確的變數宣告&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$_varName&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Doe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 以下劃線開頭的變數宣告&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;不同類型的變數整數浮點數字串布林值等&quot;&gt;不同類型的變數（整數、浮點數、字串、布林值等）&lt;/h3&gt;&lt;p&gt;PHP 支持多種數據類型，包括整數、浮點數（或雙精度數）、字串和布林值。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$integer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 整數&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$float&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;42.24&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 浮點數&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$string&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Hello World&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 字串&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$boolean&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 布林值&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;變數的作用域localglobalstatic&quot;&gt;變數的作用域（local、global、static）&lt;/h3&gt;&lt;p&gt;變數的作用域決定了在哪裡可以訪問該變數。在 PHP 中，變數可以有局部作用域、全局作用域或靜態作用域。&lt;p&gt;&lt;strong&gt;作用域說明：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;局部變數（Local）&lt;/strong&gt;：在函數內部宣告的變數，只能在該函數內部使用&lt;li&gt;&lt;strong&gt;全局變數（Global）&lt;/strong&gt;：在函數外部宣告的變數，可以在函數外部使用，但在函數內部需要使用 &lt;code&gt;global&lt;/code&gt; 關鍵字才能訪問&lt;li&gt;&lt;strong&gt;靜態變數（Static）&lt;/strong&gt;：在函數內部使用 &lt;code&gt;static&lt;/code&gt; 關鍵字宣告的變數，其值在函數調用之間會保留&lt;/ul&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$globalVar&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;global&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 全局變數&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;testFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;global&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$globalVar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 在函數內訪問全局變數需要使用 global 關鍵字&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;$localVar&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;local&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 局部變數&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$globalVar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 現在可以正常訪問全局變數&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;testFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;預定義的超全局變數&quot;&gt;預定義的超全局變數&lt;/h3&gt;&lt;p&gt;PHP 提供了許多預定義的超全局變數，這些變數在全局範圍內始終可用，不需要使用 &lt;code&gt;global&lt;/code&gt; 關鍵字就可以在任何地方訪問。&lt;p&gt;&lt;strong&gt;常用的超全局變數：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;$_GET&lt;/code&gt;：從 URL 參數獲取數據&lt;li&gt;&lt;code&gt;$_POST&lt;/code&gt;：從表單 POST 請求獲取數據&lt;li&gt;&lt;code&gt;$_SESSION&lt;/code&gt;：存儲會話數據&lt;li&gt;&lt;code&gt;$_COOKIE&lt;/code&gt;：獲取 Cookie 數據&lt;li&gt;&lt;code&gt;$_SERVER&lt;/code&gt;：包含伺服器和執行環境的資訊&lt;/ul&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 使用 $_GET 超全局變數從 URL 獲取數據&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 例如：http://example.com/index.php?name=John&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$_GET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Hi &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_GET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;安全提醒：&lt;/strong&gt;&lt;p&gt;使用超全局變數時，務必進行資料驗證和過濾，以防止安全漏洞（如 XSS 攻擊）。可以使用 &lt;code&gt;htmlspecialchars()&lt;/code&gt; 或 &lt;code&gt;filter_input()&lt;/code&gt; 函數來處理輸入資料。&lt;p&gt;更多超全局變數請參考：&lt;a href=&quot;https://www.php.net/manual/en/reserved.variables.php&quot;&gt;Predefined Variables&lt;/a&gt;&lt;h2 id=&quot;條件判斷&quot;&gt;條件判斷&lt;/h2&gt;&lt;h3 id=&quot;ifelse-與-elseif-的基本使用&quot;&gt;if、else 與 elseif 的基本使用&lt;/h3&gt;&lt;p&gt;&lt;code&gt;if&lt;/code&gt; 語句用於根據條件執行代碼。如果條件為真，則執行代碼；&lt;code&gt;else&lt;/code&gt; 與 &lt;code&gt;elseif&lt;/code&gt; 提供了額外的條件判斷。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$age&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$age&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;您是成年人。&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;elseif&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$age&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$age&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;您是未成年人。&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;無效的年齡。&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;switch-語句的使用場景&quot;&gt;switch 語句的使用場景&lt;/h3&gt;&lt;p&gt;當您需要依據同一變數的值，來區分多個條件時，&lt;code&gt;switch&lt;/code&gt; 語句是一個更好的選擇。它比多個 &lt;code&gt;if-elseif&lt;/code&gt; 語句更清晰、更容易維護。&lt;p&gt;&lt;strong&gt;使用 switch 的優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;程式碼更簡潔易讀&lt;li&gt;執行效率通常比多個 if-elseif 更高&lt;li&gt;更容易維護和擴展&lt;/ul&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$today&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Monday&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$today&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Monday&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;今天是星期一。&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Tuesday&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;今天是星期二。&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 其他情況...&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;查無此日。&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;比較與邏輯運算符的使用&quot;&gt;比較與邏輯運算符的使用&lt;/h3&gt;&lt;p&gt;比較運算符（如 &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;）用於比較兩個值，而邏輯運算符（如 &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, &lt;code&gt;||&lt;/code&gt;, &lt;code&gt;!&lt;/code&gt;）用於組合比較運算符。&lt;p&gt;&lt;strong&gt;重要的比較運算符：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;==&lt;/code&gt;：相等（只比較值，不比較類型）&lt;li&gt;&lt;code&gt;===&lt;/code&gt;：全等（比較值和類型）&lt;li&gt;&lt;code&gt;!=&lt;/code&gt; 或 &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;：不等於&lt;li&gt;&lt;code&gt;!==&lt;/code&gt;：不全等&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;建議：&lt;/strong&gt;&lt;p&gt;在 PHP 中，建議使用 &lt;code&gt;===&lt;/code&gt; 和 &lt;code&gt;!==&lt;/code&gt; 進行嚴格比較，這樣可以避免類型轉換帶來的意外結果。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$age&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$hasPermission&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$age&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$hasPermission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;您可以進入。&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;您無法進入。&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;迴圈&quot;&gt;迴圈&lt;/h2&gt;&lt;h3 id=&quot;for&quot;&gt;for&lt;/h3&gt;&lt;p&gt;&lt;code&gt;for&lt;/code&gt; 迴圈是當您知道迴圈應該執行的次數時使用。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;迴圈次數: &lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;/span&gt; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;while&quot;&gt;while&lt;/h3&gt;&lt;p&gt;當您不知道迴圈應該執行的次數時，使用 &lt;code&gt;while&lt;/code&gt; 迴圈。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;迴圈次數: &lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;/span&gt; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;do-while&quot;&gt;do-while&lt;/h3&gt;&lt;p&gt;&lt;code&gt;do-while&lt;/code&gt; 迴圈至少執行一次代碼，然後才檢查條件。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;迴圈次數: &lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;/span&gt; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;foreach&quot;&gt;foreach&lt;/h3&gt;&lt;p&gt;&lt;code&gt;foreach&lt;/code&gt; 迴圈用於遍歷陣列的元素。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$colors&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;red&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;green&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;blue&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$colors&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;顏色: &lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color&lt;/span&gt;&lt;/span&gt; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;迴圈控制語句breakcontinue&quot;&gt;迴圈控制語句（break、continue）&lt;/h3&gt;&lt;p&gt;&lt;code&gt;break&lt;/code&gt; 用於立即退出迴圈，&lt;code&gt;continue&lt;/code&gt; 用於跳過當前迴圈的剩餘代碼並開始下一次迴圈。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 跳過數值 3&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 當數值達到 8 時退出迴圈&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;迴圈次數: &lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;/span&gt; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;陣列&quot;&gt;陣列&lt;/h2&gt;&lt;h3 id=&quot;陣列的創建與基本操作添加刪除排序&quot;&gt;陣列的創建與基本操作（添加、刪除、排序）&lt;/h3&gt;&lt;p&gt;陣列是存儲多個值的變數。在 PHP 中，有多種方式可以創建和操作陣列。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 創建陣列&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$fruits&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;apple&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;banana&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;cherry&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 添加元素&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$fruits&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;durian&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 刪除元素&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;unset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$fruits&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 移除 &quot;banana&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 排序&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$fruits&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 升序排序&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;數值與關聯陣列的區別&quot;&gt;數值與關聯陣列的區別&lt;/h3&gt;&lt;p&gt;數值陣列使用數字作為索引（從 0 開始），而關聯陣列使用您指定的 KEY（可以是字串）。&lt;p&gt;&lt;strong&gt;選擇建議：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;使用數值陣列：當你需要按順序存儲數據，且不需要特定的鍵名時&lt;li&gt;使用關聯陣列：當你需要用有意義的鍵名來存取數據時（例如：用戶 ID、產品名稱等）&lt;/ul&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 數值陣列&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$colors&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;red&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;green&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;blue&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 關聯陣列&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$ages&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Peter&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Clark&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;John&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;28&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;陣列的遍歷方法&quot;&gt;陣列的遍歷方法&lt;/h3&gt;&lt;p&gt;遍歷陣列即是訪問陣列中的每個元素。&lt;code&gt;foreach&lt;/code&gt; 是最常用的遍歷方法。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 關聯陣列的遍歷&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$ages&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$age&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$name&lt;/span&gt;&lt;/span&gt; is &lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$age&lt;/span&gt;&lt;/span&gt; years old.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;進階陣列&quot;&gt;進階陣列&lt;/h2&gt;&lt;h3 id=&quot;陣列的內建函數&quot;&gt;陣列的內建函數&lt;/h3&gt;&lt;p&gt;PHP 提供了許多內建函數來操作陣列。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// array_filter 用於過濾陣列&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$numbers&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$even&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;array_filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$numbers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$number&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// array_map 用於對每個元素應用回調函數&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$squared&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;array_map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$number&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$numbers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;陣列的合併分割與比較&quot;&gt;陣列的合併、分割與比較&lt;/h3&gt;&lt;p&gt;合併陣列可以使用 &lt;code&gt;array_merge&lt;/code&gt;，分割陣列可以使用 &lt;code&gt;array_slice&lt;/code&gt;，比較陣列可以使用 &lt;code&gt;array_diff&lt;/code&gt; 和 &lt;code&gt;array_intersect&lt;/code&gt;。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 合併陣列&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$combined&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;array_merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$fruits&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$colors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 分割陣列&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$sliced&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;array_slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$combined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 比較陣列&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$difference&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;array_diff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$combined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$fruits&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;函數&quot;&gt;函數&lt;/h2&gt;&lt;h3 id=&quot;自定義函數的創建與參數&quot;&gt;自定義函數的創建與參數&lt;/h3&gt;&lt;p&gt;在 PHP 中，自定義函數是一種封裝代碼以便重用的方式。函數可以接受參數，這些參數可以是任何類型的數據。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 定義一個函數&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Hello, &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 調用函數&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;World&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出: Hello, World!&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;返回值的類型與作用&quot;&gt;返回值的類型與作用&lt;/h3&gt;&lt;p&gt;函數可以返回值，返回值可以是任何類型，包括數組和對象。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 定義一個函數返回數組&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;getFruitColors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;apple&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;red&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;banana&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;yellow&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 獲取返回值&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$fruitColors&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getFruitColors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$fruitColors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;apple&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出: red&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;匿名函數與閉包anonymous-or-closures&quot;&gt;匿名函數與閉包（anonymous or closures）&lt;/h3&gt;&lt;p&gt;匿名函數，也稱為閉包，允許臨時創建一個沒有指定名稱的函數。閉包可以捕獲外部變數，這使得它們非常適合用於回調函數和高階函數。&lt;p&gt;&lt;strong&gt;使用場景：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;作為回調函數傳遞給其他函數&lt;li&gt;在陣列操作中使用（如 &lt;code&gt;array_map&lt;/code&gt;、&lt;code&gt;array_filter&lt;/code&gt;）&lt;li&gt;創建事件處理器&lt;/ul&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 匿名函數&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$greet&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Hello, &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 調用匿名函數&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$greet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;PHP&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出: Hello, PHP!&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;進階函數&quot;&gt;進階函數&lt;/h2&gt;&lt;h3 id=&quot;引用傳遞與值傳遞的差異&quot;&gt;引用傳遞與值傳遞的差異&lt;/h3&gt;&lt;p&gt;在 PHP 中，默認情況下函數參數是通過值傳遞的。如果希望通過引用傳遞，可以在參數前加上 &lt;code&gt;&amp;amp;&lt;/code&gt; 符號。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 通過引用傳遞&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;addExclamation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$string&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token variable&quot;&gt;$str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;addExclamation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出: Hello!&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;可變參數函數的使用&quot;&gt;可變參數函數的使用&lt;/h3&gt;&lt;p&gt;可變參數函數允許接受任意數量的參數。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 可變參數函數&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$numbers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;array_sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$numbers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出: 10&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;類型聲明與嚴格模式的使用&quot;&gt;類型聲明與嚴格模式的使用&lt;/h3&gt;&lt;p&gt;類型聲明允許函數指定參數和返回值的類型。自 PHP 7 起，可以啟用嚴格模式。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 啟用嚴格模式&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;declare&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;strict_types&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword type-hint&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword type-hint&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword return-type&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 類型錯誤&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;嚴格模式的重要性：&lt;/strong&gt;&lt;p&gt;預設狀況下，PHP 會進行類型轉換，所以 &lt;code&gt;add(5, &amp;quot;5&amp;quot;)&lt;/code&gt; 不會有錯誤。但啟用了嚴格模式（&lt;code&gt;declare(strict_types=1);&lt;/code&gt;）後，數字 5 和字串 &amp;quot;5&amp;quot; 被視為不同的類型，會產生類型錯誤。這有助於及早發現程式錯誤，提高程式碼品質。&lt;h3 id=&quot;生成器generators的使用&quot;&gt;生成器（generators）的使用&lt;/h3&gt;&lt;p&gt;生成器提供了一種簡單的方式來實現迭代器，允許你通過 &lt;code&gt;yield&lt;/code&gt; 關鍵字來生成一系列的值。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 使用生成器&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;getNumbers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getNumbers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$number&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;PHP_EOL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出: 0 1 2 3 4&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;總結&quot;&gt;總結&lt;/h2&gt;&lt;p&gt;在學習了 PHP 的基礎知識後，您已經具備了開始建立網頁應用程式的能力。但是，程式設計和網頁開發是一個不斷進步的領域，有許多進階主題和相關技術等待您的探索。&lt;p&gt;&lt;strong&gt;下一步學習方向：&lt;/strong&gt;&lt;p&gt;以下是一些您可以繼續學習的方向：&lt;h4 id=&quot;物件導向程式設計OOP&quot;&gt;物件導向程式設計（OOP）&lt;/h4&gt;&lt;p&gt;深入了解類別、物件、繼承、多態性和封裝等概念，這些都是物件導向程式設計的核心。透過OOP，您可以寫出更模組化、可重用和易於維護的代碼。&lt;h4 id=&quot;設計模式&quot;&gt;設計模式&lt;/h4&gt;&lt;p&gt;設計模式是前人的心血結晶，實作經由驗證過的解決方案，解決特定問題領域。這些模式提供了一個重用軟件設計的方法，可以在許多不同情境中使用，而不必每次都重新發明輪子。&lt;h4 id=&quot;PHP-框架&quot;&gt;PHP 框架&lt;/h4&gt;&lt;p&gt;學習如 Laravel、Symfony 或 CodeIgniter 等流行的PHP框架。這些框架提供了許多功能，如路由、模板引擎、ORM、安全性和緩存，可以幫助您更快速、更高效地開發複雜的應用程式。&lt;h4 id=&quot;資料庫&quot;&gt;資料庫&lt;/h4&gt;&lt;p&gt;除了MySQL，您可以探索其他類型的資料庫，如 PostgreSQL、MongoDB 或 Redis。了解如何設計資料庫、執行複雜查詢和優化資料存取效能。&lt;h4 id=&quot;安全性&quot;&gt;安全性&lt;/h4&gt;&lt;p&gt;網站安全是一個廣泛且複雜的主題，包括了解如何防範 SQL 注入、跨站腳本（XSS）、跨站請求偽造（CSRF）和其他安全漏洞。&lt;h4 id=&quot;API-開發&quot;&gt;API 開發&lt;/h4&gt;&lt;p&gt;學習如何創建和使用 Web API，包括 REST 和 GraphQL。了解如何設計良好的 API 介面，以及如何使用OAuth 等方式來保護您的 API 和資料。&lt;h4 id=&quot;測試和維護&quot;&gt;測試和維護&lt;/h4&gt;&lt;p&gt;學習自動化測試，包括單元測試、功能測試和集成測試，以確保您的代碼品質。了解如何使用版本控制系統，如 Git，來管理代碼變更和協作。&lt;h4 id=&quot;性能優化&quot;&gt;性能優化&lt;/h4&gt;&lt;p&gt;探索如何優化 PHP 代碼的性能，包括使用 OPcache、瞭解資料庫索引、緩存策略和代碼剖析。&lt;h4 id=&quot;現代前端技術&quot;&gt;現代前端技術&lt;/h4&gt;&lt;p&gt;PHP 通常用於後端開發，但了解前端技術如 HTML、CSS、JavaScript 及框架如 React 或 Vue.js，將使您成為一名全端開發者。&lt;p&gt;&lt;strong&gt;持續學習的重要性：&lt;/strong&gt;&lt;p&gt;透過不斷學習和實踐，將能夠擴展更多技能，並在網頁開發的世界中保持競爭力。記住，程式設計是一個需要持續學習的領域，技術不斷更新，保持學習的熱忱和好奇心是成功的關鍵。&lt;p&gt;&lt;strong&gt;實作建議：&lt;/strong&gt;&lt;p&gt;學習程式設計最好的方式就是動手實作。建議你：&lt;ol&gt;&lt;li&gt;從簡單的專案開始，逐步增加複雜度&lt;li&gt;閱讀其他人的程式碼，學習最佳實踐&lt;li&gt;參與開源專案，與其他開發者交流&lt;li&gt;建立自己的專案作品集&lt;/ol&gt;&lt;p&gt;更多參考教學：&lt;a href=&quot;https://www.php.net/manual/en/langref.php&quot;&gt;PHP Language Reference&lt;/a&gt;</content>
  </entry>
  <entry>
    <title>免費 SSL 憑證完全指南：Let&#39;s Encrypt vs ZeroSSL 2026 對比</title>
    <link href="https://kamadiam.com/free-ssl-certificate/" />
    <updated>2023-10-31T19:55:18Z</updated>
    <id>https://kamadiam.com/free-ssl-certificate/</id>
    <content type="html">&lt;p&gt;本文將介紹 3 個免費 SSL 憑證頒發機構，說明一般的申請和驗證步驟，最後並提供免費的檢測 SSL 工具，對個人或小型商業網站都可以參考。無論你是剛開始架設網站的新手，還是想要為現有網站增加安全性的站長，這篇文章都能幫助你了解如何免費獲得 SSL 憑證。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/free-ssl-certificate/#%E5%85%8D%E8%B2%BB-SSL-%E6%86%91%E8%AD%89%E7%B0%A1%E4%BB%8B&quot;&gt;免費 SSL 憑證簡介&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/free-ssl-certificate/#%E7%94%B3%E8%AB%8B%E5%85%8D%E8%B2%BB-SSL-%E6%86%91%E8%AD%89%E7%9A%84%E4%B8%80%E8%88%AC%E6%AD%A5%E9%A9%9F&quot;&gt;申請免費 SSL 憑證的一般步驟&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/free-ssl-certificate/#%E4%B8%89%E5%A4%A7%E5%85%8D%E8%B2%BB-SSL-%E6%86%91%E8%AD%89%E9%A0%92%E7%99%BC%E6%A9%9F%E6%A7%8B&quot;&gt;三大免費 SSL 憑證頒發機構&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/free-ssl-certificate/#SSL-%E6%AA%A2%E6%9F%A5%E5%B7%A5%E5%85%B7&quot;&gt;SSL 檢查工具&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;免費-SSL-憑證簡介&quot;&gt;免費 SSL 憑證簡介&lt;/h2&gt;&lt;p&gt;免費 SSL 憑證是一種網站安全工具，提供基礎的資料加密和身份驗證功能，但通常具有較短的有效期限（通常是 30-90 天）。這種憑證的主要優勢是費用低廉（甚至免費），使得預算有限或是初創的小型網站也能提供基本的網站安全，讓網站能夠使用 HTTPS 協定來保護用戶資料。&lt;h3 id=&quot;為什麼是必要的?&quot;&gt;為什麼是必要的？&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;資料保護:&lt;/strong&gt; 免費 SSL 憑證為用戶提供了最基本的資料加密，保護其隱私和敏感資訊。&lt;p&gt;&lt;strong&gt;增加信任度:&lt;/strong&gt; 即使是免費的 SSL 憑證，也能讓您的網站在網址列中顯示 &amp;quot;https&amp;quot; 和鎖頭圖標，這通常會讓訪客感到更加安心，提升網站的可信度。&lt;p&gt;&lt;strong&gt;SEO 優勢:&lt;/strong&gt; 搜尋引擎，如 Google，傾向於將使用 SSL 憑證的網站排在更高的位置。&lt;p&gt;&lt;strong&gt;符合基本規範:&lt;/strong&gt; 許多線上服務和支付閘道要求網站必須使用 SSL 憑證，即使是免費的也能滿足最基本的需求。&lt;p&gt;&lt;strong&gt;簡單快速:&lt;/strong&gt; 免費 SSL 憑證通常很容易申請和安裝，是一個為網站增加基本安全性的快速方法。&lt;p&gt;&lt;strong&gt;注意事項：&lt;/strong&gt;&lt;p&gt;但值得注意的是，免費 SSL 憑證通常不提供高級的保障措施，例如延伸驗證（Extended Validation, EV）或組織驗證（Organization Validation, OV），而且需要較頻繁的續訂。對於涉及高度敏感資訊或大規模商業運營的網站，可能需要考慮使用付費的 SSL 憑證來獲得更全面和持久的保護。&lt;p&gt;如果您計劃架設一個新網站，使用免費 SSL 憑證是一個提供基本網站安全，同時又不需花費太多資源的好選擇。它能夠滿足大多數個人網站和小型商業網站的基本安全需求。&lt;h2 id=&quot;申請免費-SSL-憑證的一般步驟&quot;&gt;申請免費 SSL 憑證的一般步驟&lt;/h2&gt;&lt;p&gt;申請免費的 SSL 憑證涉及幾個主要步驟，這些步驟會根據您選擇的提供商而有所不同。以下是一個通用的指南，詳細規定請參考各憑證頒發機構的官方文件：&lt;p&gt;&lt;strong&gt;1. 選擇 SSL 提供商：&lt;/strong&gt;&lt;p&gt;研究並選擇最適合您需求的免費 SSL 憑證頒發機構。熱門選項包括 Let&#39;s Encrypt、Cloudflare 和 ZeroSSL。每個提供商都有其特色和適用場景，可以根據您的技術能力和需求來選擇。&lt;p&gt;&lt;strong&gt;2. 註冊帳戶：&lt;/strong&gt;&lt;p&gt;訪問您選擇的提供商的官方網站，並註冊帳戶。大多數提供商都提供免費註冊，只需要基本的資訊即可。&lt;p&gt;&lt;strong&gt;3. 域名驗證：&lt;/strong&gt;&lt;p&gt;通常需要證明您擁有域名的所有權。一般可以通過以下幾種方式之一來完成：&lt;ul&gt;&lt;li&gt;DNS TXT 記錄：在您的域名 DNS 設定中添加特定的 TXT 記錄&lt;li&gt;電子郵件驗證：接收並回覆驗證郵件&lt;li&gt;文件上傳驗證：在網站根目錄上傳驗證文件&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;4. 生成憑證：&lt;/strong&gt;&lt;p&gt;一旦您的域名獲得驗證，就可以生成 SSL 憑證。某些服務會自動執行此步驟，而有些則需要手動觸發。&lt;p&gt;&lt;strong&gt;5. 安裝憑證：&lt;/strong&gt;&lt;p&gt;獲得憑證後，需要將其安裝到網站伺服器上。這個過程會根據您的網站主機環境而有所不同。通常，需要上傳兩個文件：&lt;ul&gt;&lt;li&gt;憑證文件（通常是 &lt;code&gt;.crt&lt;/code&gt; 或 &lt;code&gt;.pem&lt;/code&gt;）&lt;li&gt;私鑰文件（通常是 &lt;code&gt;.key&lt;/code&gt;）&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;6. 更新網站配置：&lt;/strong&gt;&lt;p&gt;配置網站伺服器以使用您域名的 SSL 憑證。具體過程會根據是否使用 Apache、Nginx 或其他網站伺服器而有所不同。如果您使用 cPanel 可以簡化整個過程，或者使用虛擬主機提供的介面，一般都會提供自動安裝功能，讓設定更加便利。&lt;p&gt;&lt;strong&gt;7. 測試安裝：&lt;/strong&gt;&lt;p&gt;使用 SSL 檢查工具確保 SSL 憑證已正確安裝。這一步非常重要，可以確保您的網站能夠正常使用 HTTPS。&lt;p&gt;&lt;strong&gt;8. 自動更新憑證設定：&lt;/strong&gt;&lt;p&gt;設定自動憑證更新。許多提供商都提供這個功能或提供相關文檔。由於免費憑證的有效期通常較短（90 天），自動更新功能可以避免憑證過期的問題。&lt;p&gt;&lt;strong&gt;9. 監控：&lt;/strong&gt;&lt;p&gt;即使已設定自動更新，也要留意憑證的到期日期，以確保服務不間斷。建議定期檢查憑證狀態，確保自動更新功能正常運作。&lt;p&gt;&lt;strong&gt;各提供商的特色：&lt;/strong&gt;&lt;p&gt;當您想使用 Let&#39;s Encrypt 的免費 SSL 憑證時，一切都是自動化的，只需要使用 Certbot 這類的軟體，它會自動驗證您的域名並安裝憑證。這對於熟悉命令列操作的開發者來說非常方便。&lt;p&gt;如果您選擇 Cloudflare，步驟也很簡單。首先，將您網站的 DNS 設定改成 Cloudflare DNS。等 DNS 設定傳播完成後，Cloudflare 會自動為您應用 SSL 憑證。這個過程幾乎不需要任何手動操作，非常適合不熟悉技術細節的用戶。&lt;p&gt;至於 ZeroSSL，它提供一個非常友善的操作介面，也就是一個簡單易用的儀表板。但這個平台需要您手動下載憑證檔案，然後自行安裝到您的網站上。雖然需要多一個步驟，但介面清晰易懂，對於初學者來說也很友好。&lt;p&gt;所以，這三個平台各有各的優點，選擇哪個主要看您的需求和個人喜好。如果您偏好自動化，可以選擇 Let&#39;s Encrypt 或 Cloudflare；如果您需要更直觀的操作介面，ZeroSSL 可能是更好的選擇。&lt;h2 id=&quot;三大免費-SSL-憑證頒發機構&quot;&gt;三大免費 SSL 憑證頒發機構&lt;/h2&gt;&lt;p&gt;以下是一個比較各種免費 SSL 憑證提供商的表格，幫助您快速了解各提供商的特色：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;提供商&lt;th&gt;自動化&lt;th&gt;更新周期&lt;th&gt;信任程度&lt;th&gt;附加服務&lt;th&gt;限制&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Let’s Encrypt&lt;td&gt;是&lt;td&gt;90天&lt;td&gt;高&lt;td&gt;無&lt;td&gt;必須設定自動續期&lt;tr&gt;&lt;td&gt;Cloudflare&lt;td&gt;是&lt;td&gt;自動&lt;td&gt;高&lt;td&gt;CDN, DDoS防護&lt;td&gt;必須使用 Cloudflare 的 DNS&lt;tr&gt;&lt;td&gt;ZeroSSL&lt;td&gt;部分&lt;td&gt;90天&lt;td&gt;高&lt;td&gt;有付費選項&lt;td&gt;免費憑證需要手動續期&lt;/table&gt;&lt;h3 id=&quot;Lets-Encrypt&quot;&gt;Let’s Encrypt&lt;/h3&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/XyGKjTt_wg-300.webp 300w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/XyGKjTt_wg-300.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;75&quot;&gt;&lt;/picture&gt;&lt;p&gt;&lt;strong&gt;公司簡介:&lt;/strong&gt;&lt;br&gt;Let&#39;s Encrypt 是一個開放和自動化的憑證頒發機構，由網際網路安全研究小組（Internet Security Research Group, ISRG）運營。成立於 2014 年，該組織致力於推動網路安全，特別是透過讓 SSL/TLS 憑證更容易獲得和管理。這家機構得到了 Mozilla、Cisco、EFF（電子前沿基金會）等多家大型企業和非營利組織的支持。它成立的主要目的是減少獲取和管理憑證的複雜性，這經常阻礙了網站所有者實施 HTTPS。更多詳細資訊可以在他們的&lt;a href=&quot;https://letsencrypt.org/&quot;&gt;官方網站&lt;/a&gt;上找到。&lt;p&gt;&lt;strong&gt;功能:&lt;/strong&gt;&lt;br&gt;Let&#39;s Encrypt 旨在簡化 SSL 憑證的申請過程。使用 ACME（自動化憑證管理環境）協定，Let&#39;s Encrypt 可以自動驗證域名所有權，並發行和安裝憑證。頒發的是 DV（Domain Validation）憑證，主要用於確保資料傳輸過程的加密。憑證有 90 天的有效期，但提供自動續訂功能，從而減少了手動管理的需要。&lt;p&gt;&lt;strong&gt;附加服務:&lt;/strong&gt;&lt;br&gt;多個開源和商業應用已經整合了 Let’s Encrypt，可以簡化憑證的部署和管理。&lt;p&gt;&lt;strong&gt;優點和缺點：&lt;/strong&gt;&lt;p&gt;Let&#39;s Encrypt 的主要優點包括易於使用、無需支付費用、以及大量的社群和商業支持。其自動續訂功能使得憑證管理更加無痛，幾乎不需要人工介入。&lt;p&gt;然而，它也有一些局限性。首先，其 90 天的憑證有效期相對較短。這需要網站所有者設定自動續訂，否則可能會導致憑證過期，造成網站無法正常運作。其次，Let&#39;s Encrypt 只提供 DV 憑證，而沒有提供 OV（組織驗證）或 EV（擴展驗證）憑證，這些通常用於更大型的企業或需要更高級別安全保證的網站。&lt;p&gt;您可能有興趣：多數 cPanel 主機可用 AutoSSL／Let&#39;s Encrypt 一鍵申請並自動續約；細節也可對照 &lt;a href=&quot;https://kamadiam.com/zerossl-tutorial/&quot;&gt;ZeroSSL 教學&lt;/a&gt;。&lt;h3 id=&quot;ZeroSSL&quot;&gt;ZeroSSL&lt;/h3&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/FnWiEYk2O8-300.webp 300w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/FnWiEYk2O8-300.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;92&quot;&gt;&lt;/picture&gt;&lt;p&gt;&lt;strong&gt;公司簡介:&lt;/strong&gt;&lt;br&gt;ZeroSSL 是一家專門提供 SSL/TLS 憑證的公司，於 2016 年成立。它是一家相對年輕但快速崛起的企業，專注於簡化 SSL 憑證的申請和管理過程。該公司總部位於歐洲，並以其用戶友善的介面和靈活的憑證選項聞名。為了更全面地了解 ZeroSSL，您可以造訪他們的&lt;a href=&quot;https://zerossl.com/&quot;&gt;官方網站&lt;/a&gt;。&lt;p&gt;&lt;strong&gt;功能:&lt;/strong&gt;&lt;br&gt;ZeroSSL 提供多種類型的 SSL 憑證，包括域名驗證（DV）和擴展驗證（EV）憑證。他們的免費 SSL 憑證具有 90 天的有效期，並且支援自動續訂。除了基本的單一域名憑證之外，ZeroSSL 還提供通配符憑證，這允許您用單一個憑證保護無限數量的子域名。&lt;p&gt;&lt;strong&gt;附加服務:&lt;/strong&gt;&lt;br&gt;ZeroSSL 有提供 REST API，這使得大型組織能夠更容易地整合和管理 SSL 憑證。&lt;p&gt;&lt;strong&gt;優點和缺點：&lt;/strong&gt;&lt;p&gt;ZeroSSL 最大的優點是其簡單易用的介面和多樣的憑證選項，這使得它對於不同規模和需求的企業都很適用。而且，由於提供免費的 SSL 憑證，這使得小型網站和個人用戶能夠輕鬆地增加他們網站的安全性。&lt;p&gt;然而，該服務的免費憑證有 90 天的有效期限，這表示用戶需要定期續訂。雖然提供自動續訂功能，但免費版本需要手動下載和安裝憑證。另外，雖然他們提供多樣的憑證選項，但進階選項可能會變得相對昂貴。&lt;p&gt;您可能有興趣：&lt;a href=&quot;https://kamadiam.com/zerossl-tutorial/&quot;&gt;ZeroSSL 教學，免費 SSL 憑證-申請與安裝步驟&lt;/a&gt;&lt;h3 id=&quot;Cloudflare&quot;&gt;Cloudflare&lt;/h3&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/51lzpZeYhh-300.webp 300w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/51lzpZeYhh-300.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;71&quot;&gt;&lt;/picture&gt;&lt;p&gt;&lt;strong&gt;公司簡介:&lt;/strong&gt;&lt;br&gt;Cloudflare 是一家美國公司，於 2009 年成立，專注於為網站提供內容分發網路（CDN）、網路安全、DDoS 保護和域名服務。Cloudflare 致力於改善網路的整體效能和安全性。公司的服務在全球有超過 200 個資料中心，為數以百萬計的網站提供支援。更多資訊可以在他們的&lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;官方網站&lt;/a&gt;上找到。&lt;p&gt;&lt;strong&gt;功能:&lt;/strong&gt;&lt;br&gt;Cloudflare 提供了多種 SSL 憑證選項，包括基本的共享 SSL 憑證和自訂 SSL 憑證。他們的 Universal SSL 是免費的，並且在用戶啟用 Cloudflare 服務後自動發佈和續訂。此外，他們還提供對 HTTP/3、0-RTT 和 TLS 1.3 等現代安全標準的支援。&lt;p&gt;&lt;strong&gt;附加服務:&lt;/strong&gt;&lt;br&gt;除了 SSL 服務之外，Cloudflare 還提供一系列其他安全和效能優化工具，包括 Web 應用程式防火牆（WAF）、圖像和影片優化、流量平衡以及安全性分析等。&lt;p&gt;&lt;strong&gt;優點和缺點：&lt;/strong&gt;&lt;p&gt;Cloudflare 的主要優點是它為用戶提供了一個全面的安全和效能優化解決方案。其 SSL 服務能夠與其他安全功能緊密整合，提供額外的保護。另外，由於其全球資料中心網路，憑證分發和更新都非常迅速，幾乎是即時的。&lt;p&gt;然而，雖然基本的 SSL 服務是免費的，但進階功能和更高級別的安全憑證則需要額外支付。此外，使用 Cloudflare 的 SSL 服務需要將 DNS 設定轉移到 Cloudflare，這對於僅需要基本 SSL 憑證的小型網站來說，可能顯得過於繁瑣。但如果你同時需要 CDN 和 DDoS 防護等功能，Cloudflare 是一個很好的選擇。&lt;h2 id=&quot;SSL-檢查工具&quot;&gt;SSL 檢查工具&lt;/h2&gt;&lt;p&gt;SSL 檢查工具主要用於檢查網站的 SSL 憑證是否已正確安裝，以及是否存在任何設定問題或安全漏洞。以下是一些常用的 SSL 檢查工具，可以試試看檢查自己的網站：&lt;p&gt;&lt;strong&gt;1. &lt;a href=&quot;https://www.ssllabs.com/ssltest/&quot;&gt;SSL Labs&#39; SSL Server Test&lt;/a&gt;&lt;/strong&gt;&lt;p&gt;這是一個非常詳細的檢查工具，提供了包括憑證鏈完整性、協定支援、加密套件等方面的詳細資訊。它會給出一個評分（A+ 到 F），並提供詳細的改進建議。這是業界最受信任的 SSL 檢查工具之一。&lt;p&gt;&lt;strong&gt;2. &lt;a href=&quot;https://www.geocerts.com/ssl-checker&quot;&gt;Geocerts&#39; SSL Checker&lt;/a&gt;&lt;/strong&gt;&lt;p&gt;這個工具可以迅速檢查 SSL 憑證是否正確安裝，並提供有用的診斷資訊。它會顯示憑證的有效期、頒發機構、以及憑證鏈的完整性。&lt;p&gt;&lt;strong&gt;3. &lt;a href=&quot;https://www.digicert.com/help/&quot;&gt;DigiCert® SSL Installation Diagnostics Tool&lt;/a&gt;&lt;/strong&gt;&lt;p&gt;這是另一個由憑證頒發機構提供的工具，它能夠檢查憑證是否正確安裝，並提供其他相關的 SSL 設定資訊。即使您使用的不是 DigiCert 的憑證，這個工具也能提供有用的診斷資訊。&lt;p&gt;&lt;strong&gt;4. &lt;a href=&quot;https://www.wormly.com/test_ssl&quot;&gt;Wormly SSL Web Server Tester&lt;/a&gt;&lt;/strong&gt;&lt;p&gt;這個工具提供基本的 SSL 檢查，包括憑證的有效期、憑證頒發機構等。它簡單易用，適合快速檢查憑證的基本狀態。&lt;p&gt;以上的工具各有特色和功能，您可以根據需求選擇適合的工具來進行 SSL 檢查。建議在安裝 SSL 憑證後，至少使用其中一個工具來驗證安裝是否成功，並確保沒有安全漏洞。</content>
  </entry>
  <entry>
    <title>PHP 例外處理，幫你抓住所有例外錯誤</title>
    <link href="https://kamadiam.com/php-exception-handling/" />
    <updated>2023-10-14T05:43:38Z</updated>
    <id>https://kamadiam.com/php-exception-handling/</id>
    <content type="html">&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-exception-handling/#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5&quot;&gt;基本概念&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-exception-handling/#%E5%A6%82%E4%BD%95%E8%87%AA%E8%A8%82-Exception&quot;&gt;如何自訂 Exception&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-exception-handling/#%E5%A4%9A%E9%87%8D%E6%8D%95%E7%8D%B2-Exceptions&quot;&gt;多重捕獲 Exceptions&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-exception-handling/#%E4%BD%BF%E7%94%A8-finally-%E5%8D%80%E5%A1%8A&quot;&gt;使用 finally 區塊&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-exception-handling/#%E5%AF%A6%E7%94%A8%E6%A1%88%E4%BE%8B&quot;&gt;實用案例&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-exception-handling/#%E5%B8%B8%E8%A6%8B%E5%95%8F%E9%A1%8C&quot;&gt;常見問題&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-exception-handling/#%E7%B8%BD%E7%B5%90&quot;&gt;總結&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;本文將探討 PHP 例外處理機制，包括其基本概念、如何實現，以及在實際開發中如何應用。&lt;p&gt;在日常生活中，意外總是無法避免——不論是滑倒、遺失鑰匙，還是忘記重要的約會。同樣地，在程式設計的世界裡，錯誤和異常也是無法避免的。&lt;p&gt;程式可能嘗試開啟一個不存在的檔案、除以零或是存取一個未定義的變數。這些都是「例外」（Exception）的範疇。&lt;p&gt;但與日常生活的意外不同，程式碼中的「例外」是可以（而且應該）被妥善管理的。這就是所謂的「例外處理」（Exception Handling）。&lt;p&gt;透過這種機制，可以預先定義一套規則和行為，以確保程式在遇到問題時不會突然崩潰，或是在不應該發生的情況下繼續執行。&lt;p&gt;換句話說，例外處理讓我們有機會優雅地處理問題，而不是讓整個應用程式或系統陷入混亂。&lt;h2 id=&quot;基本概念&quot;&gt;基本概念&lt;/h2&gt;&lt;p&gt;在 PHP 中，例外處理主要由三個關鍵字來實現，分別是 &lt;code&gt;try&lt;/code&gt;、&lt;code&gt;catch&lt;/code&gt; 和 &lt;code&gt;finally&lt;/code&gt;。&lt;h4 id=&quot;try-區塊&quot;&gt;&lt;code&gt;try&lt;/code&gt; 區塊&lt;/h4&gt;&lt;p&gt;這是預計可能會出問題的程式碼區塊。我們會將那些有風險的操作放在 &lt;code&gt;try&lt;/code&gt; 區塊中。例如，開啟一個檔案或執行一個數學運算。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 風險操作，例如開啟一個檔案&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fopen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;example.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;r&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;catch-區塊&quot;&gt;&lt;code&gt;catch&lt;/code&gt; 區塊&lt;/h4&gt;&lt;p&gt;如果 &lt;code&gt;try&lt;/code&gt; 區塊中的程式碼出了問題，控制流程會立即跳到 &lt;code&gt;catch&lt;/code&gt; 區塊。在這裡，可以定義如何回應那些問題，例如顯示一個錯誤訊息。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name type-declaration&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 處理例外，例如顯示錯誤訊息&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;An error occurred: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;finally-區塊&quot;&gt;&lt;code&gt;finally&lt;/code&gt; 區塊&lt;/h4&gt;&lt;p&gt;不管 &lt;code&gt;try&lt;/code&gt; 和 &lt;code&gt;catch&lt;/code&gt; 區塊的結果如何，&lt;code&gt;finally&lt;/code&gt; 區塊中的程式碼都會被執行。這是一個理想的地方來釋放資源或進行其他清理工作。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;finally&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 釋放資源，例如關閉檔案&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;fclose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;把這三個元素結合起來，就擁有了一個完整的例外處理機制，能夠幫助你更穩健地設計和執行程式。&lt;h2 id=&quot;如何自訂-Exception&quot;&gt;如何自訂 Exception&lt;/h2&gt;&lt;p&gt;在 PHP 的內建例外類型中，可能會發現沒有一個能適合描述某些特定問題。這時，建立自訂的 Exception 類型就變得特別有用。自訂 Exception 不僅能讓你更精確地描述問題，還能提高程式的可讀性和維護性。&lt;h4 id=&quot;繼承-Exception-類別&quot;&gt;繼承 &lt;code&gt;Exception&lt;/code&gt; 類別&lt;/h4&gt;&lt;p&gt;在 PHP 中，所有例外都是 &lt;code&gt;Exception&lt;/code&gt; 類別或其子類別的實例。所以，建立自訂例外首先需要繼承 &lt;code&gt;Exception&lt;/code&gt; 類別。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;FileNotFoundException&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 自訂邏輯&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;添加額外的方法和屬性&quot;&gt;添加額外的方法和屬性&lt;/h4&gt;&lt;p&gt;繼承了 &lt;code&gt;Exception&lt;/code&gt; 之後，可以添加額外的方法和屬性以滿足特定需求。例如，添加一個方法來返回更詳細的錯誤訊息。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;FileNotFoundException&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;detailedMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;File Not Found: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;使用自訂-Exception&quot;&gt;使用自訂 Exception&lt;/h4&gt;&lt;p&gt;建立了自訂 Exception 之後，就可以像使用內建 Exception 一樣在 &lt;code&gt;try&lt;/code&gt; 和 &lt;code&gt;catch&lt;/code&gt; 區塊中使用它。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 假設 $fileExists 是一個檢查檔案是否存在的函數&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$fileExists&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;example.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FileNotFoundException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;The file does not exist.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;FileNotFoundException&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;detailedMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;透過這種方式，不僅能夠將特定的錯誤情況，用一個明確且具描述性的類別代表，還能在 &lt;code&gt;catch&lt;/code&gt; 區塊中實施更精確的錯誤處理策略。&lt;h2 id=&quot;多重捕獲-Exceptions&quot;&gt;多重捕獲 Exceptions&lt;/h2&gt;&lt;p&gt;在實際開發中，一段程式碼可能會出現多種不同的錯誤或異常。那麼，如何根據不同的錯誤類型採取不同的處理策略呢？這就需要使用到多重 &lt;code&gt;catch&lt;/code&gt; 區塊。&lt;h4 id=&quot;使用多個-catch-區塊&quot;&gt;使用多個 &lt;code&gt;catch&lt;/code&gt; 區塊&lt;/h4&gt;&lt;p&gt;PHP 允許在一個 &lt;code&gt;try&lt;/code&gt; 區塊後面添加多個 &lt;code&gt;catch&lt;/code&gt; 區塊。每個 &lt;code&gt;catch&lt;/code&gt; 區塊都對應一種特定類型的 Exception。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 這裡可能會發生多種錯誤&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;FileNotFoundException&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;File-related error: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;DivisionByZeroError&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Math-related error: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;General error: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;順序的重要性&quot;&gt;順序的重要性&lt;/h4&gt;&lt;p&gt;需特別注意的是，多個 &lt;code&gt;catch&lt;/code&gt; 區塊會按照它們出現的順序來進行匹配。也就是說，最先匹配成功的 &lt;code&gt;catch&lt;/code&gt; 區塊將被執行，其餘的將被忽略。所以，一般而言，應該將更具體的 Exception 類型放在前面，將更一般的 Exception 類型放在後面。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 這樣是不好的&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;FileNotFoundException&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 這個區塊永遠不會被執行&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因為 FileNotFoundException 繼承 Exception，導致 catch Exception 會先抓到 FileNotFoundException.&lt;h4 id=&quot;為何需要多重捕獲?&quot;&gt;為何需要多重捕獲？&lt;/h4&gt;&lt;p&gt;使用多重捕獲的好處是明確和靈活。可以為不同類型的錯誤定義不同的處理邏輯，使得程式更容易維護和理解。而且，這也為未來擴展程式提供了方便，可以隨時添加新的 &lt;code&gt;catch&lt;/code&gt; 區塊來處理新類型的錯誤。&lt;h2 id=&quot;使用-finally-區塊&quot;&gt;使用 &lt;code&gt;finally&lt;/code&gt; 區塊&lt;/h2&gt;&lt;p&gt;這個區塊的程式碼會在 &lt;code&gt;try&lt;/code&gt; 和 &lt;code&gt;catch&lt;/code&gt; 區塊執行完畢後，無論是否出現例外，都會被執行。&lt;h4 id=&quot;為何使用-finally?&quot;&gt;為何使用 &lt;code&gt;finally&lt;/code&gt;？&lt;/h4&gt;&lt;p&gt;為什麼我們需要 &lt;code&gt;finally&lt;/code&gt;？答案是：資源管理和確保程式的健壯性。無論是檔案、數據庫連接，或是其他需要手動釋放的資源，&lt;code&gt;finally&lt;/code&gt; 區塊提供一個統一的地方來進行清理工作。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fopen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;example.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;r&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 讀取和處理檔案&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;An error occurred: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;finally&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;fclose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在這個範例中，不論是成功開啟檔案還是捕獲到例外，&lt;code&gt;finally&lt;/code&gt; 區塊都確保了檔案會被正確地關閉，避免檔案鎖住。&lt;h4 id=&quot;finally-的其他用途&quot;&gt;&lt;code&gt;finally&lt;/code&gt; 的其他用途&lt;/h4&gt;&lt;p&gt;除了資源管理，&lt;code&gt;finally&lt;/code&gt; 區塊還經常用於記錄，或其他需要在 &lt;code&gt;try&lt;/code&gt; 和 &lt;code&gt;catch&lt;/code&gt; 執行後無條件執行的操作。例如，你可能需要記錄一個操作的完成狀態，無論是成功還是失敗。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 嘗試進行某些操作&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 處理錯誤&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;finally&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 無論成功或失敗，都記錄操作狀態&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;logOperationStatus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用 &lt;code&gt;finally&lt;/code&gt; 區塊，可以確保某些重要的後續操作，或資源釋放動作會被執行，這不僅讓程式更健壯，也讓其更易於維護。&lt;h2 id=&quot;實用案例&quot;&gt;實用案例&lt;/h2&gt;&lt;p&gt;假設我們正在建立一個圖書管理系統，這個系統需要實現書籍資料的新增、查詢、修改和刪除。&lt;h4 id=&quot;程式碼實現&quot;&gt;程式碼實現&lt;/h4&gt;&lt;p&gt;首先，我們定義一個自訂的 &lt;code&gt;DatabaseException&lt;/code&gt; 類別，描述處理與資料庫相關的問題。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;DatabaseException&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;errorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Database Error: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;接著，在資料庫操作的函數中使用 &lt;code&gt;try&lt;/code&gt; 和 &lt;code&gt;catch&lt;/code&gt;。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;addBook&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// 嘗試連接資料庫&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$db&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PDO&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;mysql:host=localhost;dbname=library&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;username&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;password&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;// 嘗試新增書籍&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$stmt&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$db&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;INSERT INTO books (title, author) VALUES (:title, :author)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$stmt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bindParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;:title&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$stmt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bindParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;:author&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$stmt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;PDOException&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DatabaseException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Failed to add book: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;finally&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// 斷開資料庫連接&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$db&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在使用這個 &lt;code&gt;addBook&lt;/code&gt; 函數的地方，可以這樣處理例外：&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;addBook&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;1984&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;George Orwell&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Book added successfully!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;DatabaseException&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;errorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;這樣設計的好處&quot;&gt;這樣設計的好處&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;清晰的錯誤資訊&lt;/strong&gt;：使用自訂的 &lt;code&gt;DatabaseException&lt;/code&gt;，可以快速地識別出問題出在哪裡，並給出更有用的錯誤訊息。&lt;p&gt;&lt;strong&gt;資源管理&lt;/strong&gt;：透過 &lt;code&gt;finally&lt;/code&gt; 區塊，確保無論操作成功還是失敗，資料庫連接都會被正確地關閉。&lt;p&gt;&lt;strong&gt;更好的可維護性&lt;/strong&gt;：將例外處理和業務邏輯分離，使得程式更易於維護和擴展。&lt;h2 id=&quot;常見問題&quot;&gt;常見問題&lt;/h2&gt;&lt;h3 id=&quot;什麼是-PHP-例外處理?&quot;&gt;&lt;strong&gt;什麼是 PHP 例外處理？&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;例外處理是一種在 PHP 程式中處理錯誤和異常情況的機制。它使用 &lt;code&gt;try&lt;/code&gt;, &lt;code&gt;catch&lt;/code&gt;, 和 &lt;code&gt;finally&lt;/code&gt; 這三個關鍵字來實現。&lt;h3 id=&quot;什麼是-finally-區塊-?&quot;&gt;&lt;strong&gt;什麼是 &lt;code&gt;finally&lt;/code&gt; 區塊&lt;/strong&gt; ?&lt;/h3&gt;&lt;p&gt;&lt;code&gt;finally&lt;/code&gt; 區塊中的程式碼會在 &lt;code&gt;try&lt;/code&gt; 和 &lt;code&gt;catch&lt;/code&gt; 區塊後無條件執行，通常用於資源管理和清理工作。&lt;h3 id=&quot;可以在一個-try-區塊後面有多個-catch-區塊嗎?&quot;&gt;&lt;strong&gt;可以在一個 &lt;code&gt;try&lt;/code&gt; 區塊後面有多個 &lt;code&gt;catch&lt;/code&gt; 區塊嗎？&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;是的，可以使用多個 &lt;code&gt;catch&lt;/code&gt; 區塊來捕獲和處理不同類型的例外。&lt;h3 id=&quot;如何自訂一個例外類型?&quot;&gt;&lt;strong&gt;如何自訂一個例外類型？&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;可以透過繼承內建的 &lt;code&gt;Exception&lt;/code&gt; 類別來建立自訂的例外類型。&lt;h3 id=&quot;是否所有的錯誤都可以用例外處理來捕獲?&quot;&gt;&lt;strong&gt;是否所有的錯誤都可以用例外處理來捕獲？&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;不是，例外處理不能捕獲所有類型的錯誤，例如語法錯誤或致命錯誤。&lt;h3 id=&quot;除了-PHP,還有哪些程式語言支持例外處理?&quot;&gt;&lt;strong&gt;除了 PHP，還有哪些程式語言支持例外處理？&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;例外處理是一個通用的程式設計概念，多數現代程式語言（如 Java, Python, C# 等）都支持這一機制。&lt;h2 id=&quot;總結&quot;&gt;總結&lt;/h2&gt;&lt;p&gt;本文探討了 PHP 中例外處理的各個方面，包括基本概念、自訂例外、多重捕獲、使用 &lt;code&gt;finally&lt;/code&gt; 區塊，還透過一個實用案例來展示如何在實際開發中應用這些概念。&lt;p&gt;例外處理不僅能讓程式更健壯和可靠，還能提高其可維護性和可讀性，掌握這一技能是非常有價值的。因此，不論在哪個開發階段或從事哪種類型的專案，應用例外處理對程式開發與維護都有很大幫助。&lt;h4 id=&quot;參考資料&quot;&gt;參考資料&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;PHP 官方文件 – 例外處理&lt;/strong&gt;&lt;br&gt;官方文件是最可靠的資源，提供了關於 PHP 例外處理的詳細說明。&lt;br&gt;網址：&lt;a href=&quot;https://www.php.net/manual/en/language.exceptions.php&quot;&gt;PHP: Exceptions – Manual&lt;/a&gt;&lt;li&gt;&lt;strong&gt;W3Schools – PHP Exception Handling&lt;/strong&gt;&lt;br&gt;這個網站以簡單易懂的方式解釋了基礎的例外處理概念。&lt;br&gt;網址：&lt;a href=&quot;https://www.w3schools.com/php/php_try_catch.asp&quot;&gt;W3Schools PHP Exception Tutorial&lt;/a&gt;&lt;li&gt;&lt;strong&gt;GeeksforGeeks – PHP Exception Handling&lt;/strong&gt;&lt;br&gt;這個網站提供了一些實用的例子和解釋，適合進一步研究。&lt;br&gt;網址：&lt;a href=&quot;https://www.geeksforgeeks.org/exception-handling-in-php/&quot;&gt;GeeksforGeeks PHP Exception Handling&lt;/a&gt;&lt;/ol&gt;</content>
  </entry>
  <entry>
    <title>PHP static vs const：何時用哪個？完整對比</title>
    <link href="https://kamadiam.com/php-static-vs-const/" />
    <updated>2023-10-12T22:46:53Z</updated>
    <id>https://kamadiam.com/php-static-vs-const/</id>
    <content type="html">&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-static-vs-const/#%E4%BB%80%E9%BA%BC%E6%98%AF-PHP-static-%E9%97%9C%E9%8D%B5%E5%AD%97&quot;&gt;什麼是 PHP static 關鍵字&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-static-vs-const/#%E4%BB%80%E9%BA%BC%E6%98%AF-PHP-const-%E9%97%9C%E9%8D%B5%E5%AD%97&quot;&gt;什麼是 PHP const 關鍵字&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-static-vs-const/#static-%E5%92%8C-const-%E7%9A%84%E4%B8%BB%E8%A6%81%E5%B7%AE%E7%95%B0&quot;&gt;static 和 const 的主要差異&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-static-vs-const/#%E6%80%A7%E8%83%BD%E5%B0%8D%E6%AF%94&quot;&gt;性能對比&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-static-vs-const/#%E4%BD%BF%E7%94%A8%E5%A0%B4%E6%99%AF%E5%AF%A6%E4%BE%8B&quot;&gt;使用場景實例&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;什麼是-PHP-static-關鍵字&quot;&gt;什麼是 PHP &lt;code&gt;static&lt;/code&gt; 關鍵字&lt;/h2&gt;&lt;h4 id=&quot;概念與定義&quot;&gt;概念與定義&lt;/h4&gt;&lt;p&gt;在 PHP 中，&lt;code&gt;static&lt;/code&gt; 是一個特殊的關鍵字，用於宣告靜態變數和方法。所謂「靜態」表示這些變數和方法屬於類別本身，而不是類別的任何特定實例。因此，無論您建立多少個類別的實例，靜態變數和方法都只有一個。&lt;h4 id=&quot;目的與好處&quot;&gt;目的與好處&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;程式碼重用&lt;/strong&gt;：由於 &lt;code&gt;static&lt;/code&gt; 方法和變數是類別級別的，您不需要建立類別的實例就可以使用它們。這有助於減少重複的程式碼。&lt;p&gt;&lt;strong&gt;記憶體效率&lt;/strong&gt;：靜態變數在所有實例間共享，因此它們同時也節省記憶體使用。尤其在您需要多個實例共享資料或狀態時非常有用。&lt;h4 id=&quot;基礎範例&quot;&gt;基礎範例&lt;/h4&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 定義一個帶有靜態變數的 Counter 類別&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;Counter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 定義一個靜態變數 $count&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$count&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 直接存取靜態變數 $count，不需要實例化 Counter 類別&lt;/span&gt;
&lt;span class=&quot;token class-name static-context&quot;&gt;Counter&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$count&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token class-name static-context&quot;&gt;Counter&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$count&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// 輸出 10，因為我們將其設為 10&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;進階範例&quot;&gt;進階範例&lt;/h4&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 定義一個 Singleton 類別，用於確保只有一個實例存在&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;Singleton&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 保存類別的唯一實例&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$instance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 將建構函數設為 private，以防止直接建立實例&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 用於回傳唯一實例的方法&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;getInstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// 如果實例不存在，建立它&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token keyword static-context&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$instance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword static-context&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$instance&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword static-context&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$instance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 取得 Singleton 類別的唯一實例&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$singleton&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name static-context&quot;&gt;Singleton&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getInstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在這個進階範例中，我們使用 &lt;code&gt;static&lt;/code&gt; 關鍵字來實作單例模式（Singleton）。這個模式確保了一個類別只有一個實例存在。&lt;code&gt;getInstance&lt;/code&gt; 方法用於回傳這個唯一實例。&lt;h4 id=&quot;錯誤範例-–-在物件實例中修改靜態變數值&quot;&gt;錯誤範例 – 在物件實例中修改靜態變數值&lt;/h4&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;Counter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$count&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;modifyStaticVar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// 錯誤：在實例方法中試圖修改靜態變數的值&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;錯誤原因&lt;/strong&gt;：&lt;br&gt;在實例方法中使用 &lt;code&gt;$this-&amp;gt;&lt;/code&gt; 來存取靜態變數是不正確的。靜態變數應該使用 &lt;code&gt;self::$&lt;/code&gt; 或者 &lt;code&gt;類名::$&lt;/code&gt; 的方式來存取或修改。&lt;h4 id=&quot;錯誤範例-–-靜態方法使用實例變數&quot;&gt;錯誤範例 – 靜態方法使用實例變數&lt;/h4&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;MyClass&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$myVar&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;myStaticMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// 錯誤：在靜態方法中使用實例變數&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;myVar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;錯誤原因&lt;/strong&gt;：&lt;br&gt;靜態方法不能使用 &lt;code&gt;$this&lt;/code&gt; 來存取實例變數，因為靜態方法不依附於任何特定的實例。&lt;h2 id=&quot;什麼是-PHP-const-關鍵字&quot;&gt;什麼是 PHP &lt;code&gt;const&lt;/code&gt; 關鍵字&lt;/h2&gt;&lt;h4 id=&quot;概念與定義-2&quot;&gt;概念與定義&lt;/h4&gt;&lt;p&gt;&lt;code&gt;const&lt;/code&gt; 關鍵字用於定義常數，這些常數一旦被設定，就不能改變。與 &lt;code&gt;static&lt;/code&gt; 變數不同，&lt;code&gt;const&lt;/code&gt; 變數是不可變的。&lt;h4 id=&quot;目的與好處-2&quot;&gt;目的與好處&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;不變性&lt;/strong&gt;：使用 &lt;code&gt;const&lt;/code&gt; 可以確保資料的不變性。一旦一個 &lt;code&gt;const&lt;/code&gt; 變數被設定，它就不能被更改，這有助於維護程式的穩定性。&lt;p&gt;&lt;strong&gt;可預測性&lt;/strong&gt;：&lt;code&gt;const&lt;/code&gt; 變數在整個程式生命週期中的值是不變的，這使得程式行為更加可預測。&lt;h4 id=&quot;基礎範例-2&quot;&gt;基礎範例&lt;/h4&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 定義一個 Circle 類別，用一個常數來保存圓周率 PI&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;Circle&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 定義一個 const 變數 PI&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;PI&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3.14159265359&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 定義一個方法來計算圓的面積&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;getArea&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword static-context&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;PI&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 建立一個 Circle 類別的實例&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$c&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Circle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 輸出半徑為 5 的圓的面積&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getArea&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// 輸出 78.539816339744&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;進階範例-2&quot;&gt;進階範例&lt;/h4&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 定義一個 MathConstants 類別，其中包含多個數學常數&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;MathConstants&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.718281828459&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;GOLDEN_RATIO&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.618033988749895&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 輸出常數 E 和 GOLDEN_RATIO&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token class-name static-context&quot;&gt;MathConstants&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// 輸出 2.718281828459&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token class-name static-context&quot;&gt;MathConstants&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;GOLDEN_RATIO&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// 輸出 1.618033988749895&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在這個進階範例中，我們定義了一個 &lt;code&gt;MathConstants&lt;/code&gt; 類別，其中包含了數學常數（e）和黃金比例。這些常數是透過 &lt;code&gt;const&lt;/code&gt; 關鍵字定義的，因此它們是不可變的。&lt;h4 id=&quot;錯誤範例-–-嘗試修改常數&quot;&gt;錯誤範例 – 嘗試修改常數&lt;/h4&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;Circle&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;PI&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3.14159265359&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 錯誤：嘗試修改一個 const 變數&lt;/span&gt;
&lt;span class=&quot;token class-name static-context&quot;&gt;Circle&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;PI&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3.15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;錯誤原因&lt;/strong&gt;：&lt;br&gt;一旦 &lt;code&gt;const&lt;/code&gt; 變數被定義，它的值就不能被更改。試圖修改一個 &lt;code&gt;const&lt;/code&gt; 變數會導致語法錯誤。&lt;h4 id=&quot;錯誤範例-–-在方法中定義常數&quot;&gt;錯誤範例 – 在方法中定義常數&lt;/h4&gt;&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;MyClass&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;setConstant&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// 錯誤：在方法中嘗試定義常數&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;MY_CONST&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;錯誤原因&lt;/strong&gt;：&lt;br&gt;&lt;code&gt;const&lt;/code&gt; 變數必須在類別範疇（即類別的主體）內定義，而不能在方法或函數內部定義。&lt;h2 id=&quot;static-和-const-的主要差異&quot;&gt;static 和 const 的主要差異&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;特性&lt;th&gt;&lt;code&gt;static&lt;/code&gt;&lt;th&gt;&lt;code&gt;const&lt;/code&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;定義範圍&lt;/strong&gt;&lt;td&gt;可以在類別內部的任何地方（方法內或外）定義靜態變數或方法。&lt;td&gt;常數必須在類別範疇（即類別的主體）內定義，不能在方法或函數內部定義。&lt;tr&gt;&lt;td&gt;&lt;strong&gt;變數類型&lt;/strong&gt;&lt;td&gt;可以是變數或方法。&lt;td&gt;僅限於變數。&lt;tr&gt;&lt;td&gt;&lt;strong&gt;可變性&lt;/strong&gt;&lt;td&gt;靜態變數的值可以更改。&lt;td&gt;常數的值一旦被設定，就不能改變。&lt;tr&gt;&lt;td&gt;&lt;strong&gt;存取方式&lt;/strong&gt;&lt;td&gt;透過 &lt;code&gt;self::&lt;/code&gt;、&lt;code&gt;static::&lt;/code&gt; 或類名來存取。&lt;td&gt;透過 &lt;code&gt;self::&lt;/code&gt; 或類名來存取。&lt;tr&gt;&lt;td&gt;&lt;strong&gt;作用域&lt;/strong&gt;&lt;td&gt;屬於類別作用域，所有實例共享同一個靜態變數或方法。&lt;td&gt;也屬於類別作用域，但因為是不可變的，所以更多地用於儲存不變的資料或設定。&lt;tr&gt;&lt;td&gt;&lt;strong&gt;記憶體效率&lt;/strong&gt;&lt;td&gt;較高，因為所有實例共享一個靜態變數或方法。&lt;td&gt;由於常數的值是不可變的，因此在某種程度上也是記憶體效率的。&lt;tr&gt;&lt;td&gt;&lt;strong&gt;物件實例的存取&lt;/strong&gt;&lt;td&gt;不應在物件實例的方法中使用 &lt;code&gt;$this-&amp;gt;&lt;/code&gt; 來存取靜態變數或方法。&lt;td&gt;可以在實例方法中使用 &lt;code&gt;self::&lt;/code&gt; 來存取，但由於其不可變性，通常用於儲存固定的資料。&lt;/table&gt;&lt;p&gt;static vs const&lt;p&gt;這個表格概述了 &lt;code&gt;static&lt;/code&gt; 和 &lt;code&gt;const&lt;/code&gt; 的主要特性和差異，希望對您有所幫助！&lt;h2 id=&quot;性能對比&quot;&gt;性能對比&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;場景&lt;th&gt;static&lt;th&gt;const&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;記憶體&lt;td&gt;所有實例共享一份&lt;td&gt;編譯期常數，零執行時開銷&lt;tr&gt;&lt;td&gt;存取速度&lt;td&gt;略慢（執行時查找）&lt;td&gt;最快（編譯期解析）&lt;tr&gt;&lt;td&gt;OPcache&lt;td&gt;可快取&lt;td&gt;可快取&lt;/table&gt;&lt;p&gt;PHP 8.3+ 的 typed class constants 讓 const 更安全：&lt;code&gt;public const string VERSION = &#39;1.0&#39;;&lt;/code&gt;&lt;h2 id=&quot;使用場景實例&quot;&gt;使用場景實例&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;const&lt;/strong&gt;：API 端點 URL、版本號、設定上限&lt;li&gt;&lt;strong&gt;static&lt;/strong&gt;：計數器（&lt;code&gt;static $count = 0&lt;/code&gt;）、快取實例、Singleton 模式&lt;/ul&gt;</content>
  </entry>
</feed>