<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>PHP on Ender&#39;s Blog</title>
    <link>https://ender-blog.pages.dev/tags/php/</link>
    <description>Recent content in PHP on Ender&#39;s Blog</description>
    <image>
      <title>Ender&#39;s Blog</title>
      <url>https://ender-blog.pages.dev/img/cover.png</url>
      <link>https://ender-blog.pages.dev/img/cover.png</link>
    </image>
    <generator>Hugo -- 0.138.0</generator>
    <language>zh-tw</language>
    <lastBuildDate>Thu, 03 Sep 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://ender-blog.pages.dev/tags/php/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【產業新聞】PHP 8.6 Beta 1：當 PHP 也開始「管更嚴」</title>
      <link>https://ender-blog.pages.dev/posts/news-2026-09-03-php86-beta/</link>
      <pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://ender-blog.pages.dev/posts/news-2026-09-03-php86-beta/</guid>
      <description>PHP 8.6 Beta 1 在八月中釋出，帶來 Partial Function Application、原生 Polling API 跟更嚴格的錯誤處理——身為天天寫 Laravel 的後端工程師，來聊聊這幾個改動實際上會怎麼影響手上的專案。</description>
      <content:encoded><![CDATA[<h2 id="今天看到的新聞">今天看到的新聞</h2>
<p>今天看到 PHP 官方在八月中已經放出 PHP 8.6 的 Beta 1，目前整個 release 排程是 Beta 2（8/27）、Beta 3（9/10）、RC1（9/24），預計今年 11/19 正式 GA。這一版比較受矚目的幾個東西：</p>
<ul>
<li><strong>Partial Function Application（PFA）</strong>：可以只先帶部分參數給一個 function，產生一個新的 closure，等之後再把剩下的參數補上再呼叫。搭配 PHP 8.5 才剛加進來的 pipe operator <code>|&gt;</code> 用起來特別順手，因為 pipe operator 規定串起來的每個 callable 都只能吃一個參數。</li>
<li><strong>原生 <code>Io\Poll</code> API</strong>：內建的 I/O 多工（multiplexing）機制，不用再靠第三方擴充套件去處理多個 I/O 來源。</li>
<li><strong><code>Time\Duration</code> 類別</strong>：專門用來表示時間長度的物件，跟現有的 <code>DateTime</code> 系列做區隔。</li>
<li><strong>更嚴格的錯誤處理</strong>：以前很多「型別轉換時資料被默默截斷」的情況，現在會直接丟 <code>ValueError</code> 或 <code>TypeError</code>，不會再讓你不知不覺吃到一個被砍過的數字或字串。</li>
<li><strong>Session 安全預設值提升</strong>：<code>session.use_strict_mode</code> 跟 <code>session.cookie_httponly</code> 之後預設就是開啟。</li>
</ul>
<h2 id="為什麼我這個寫-laravel-的後端工程師會在意這則新聞">為什麼我這個寫 Laravel 的後端工程師會在意這則新聞</h2>
<p>先講最實際的：那個「更嚴格的錯誤處理」對我來說反而是最有感的一項，因為它動到的是「以前會安靜放過的錯誤」。舉個常見情境，Laravel 專案裡把使用者輸入丟進某個計算或格式化流程，過去如果型別對不上，PHP 可能默默幫你截斷或轉型，程式照跑，但結果是錯的——這種 bug 最難抓，因為它不會噴例外，只會在某個角落產生出一筆看起來正常、實際上是錯的資料。PHP 8.6 把這類情況改成直接丟 <code>ValueError</code>/<code>TypeError</code>，等於是把「隱性的錯誤」變成「顯性的例外」，這跟我們平常在 API 層做 request validation 的邏輯是同一個精神：與其讓錯誤資料流進系統深處某天才爆炸，不如讓它在最早的地方就噴出來。</p>
<p>第二個讓我在意的是 PFA 加 pipe operator 這個組合。老實說，Laravel 裡面本來就已經有 <code>pipeline()</code> 這種類似串接處理的寫法（例如中介層那種一路 pipe 下去的模式），但那個是框架層級提供的抽象。現在如果 PHP 語言本身就原生支援「函式局部套用 + 管道串接」，代表以後即使不靠框架的 Pipeline 類別，也能用更貼近語言原生語法的方式寫出一串「資料依序流過多個轉換函式」的邏輯，可讀性應該會比一層一層巢狀呼叫好上不少。不過這也代表要重新習慣一種寫法，畢竟平常寫 Laravel controller 或 service layer 已經很習慣物件導向那一套，要轉去想「怎麼把邏輯拆成一串可以局部套用的純函式」，多少需要一點心態上的調整。</p>
<h2 id="結語">結語</h2>
<p>目前還在 Beta 階段，GA 要等到 11 月，離真正能在 production 專案升級還有一段時間，而且升級前勢必要先確認手上用的套件（尤其是一些依賴舊有型別轉換行為的 library）會不會因為錯誤處理變嚴格而炸開。但這種「語言層級主動收緊安全網」的方向，我覺得是值得先筆記起來的，等 RC 出來後應該會找時間拉一個測試分支實際跑跑看。</p>
<h2 id="消息來源">消息來源</h2>
<ul>
<li><a href="https://www.linuxcompatible.org/story/php-860-beta-1-partial-function-application-native-polling-and-stricter-error-handling">PHP 8.6.0 Beta 1: Partial Function Application, Native Polling, and Stricter Error Handling</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>【產業新聞】Laravel Tackle：把 AI Coding Agent 塞進你的 Artisan 指令裡</title>
      <link>https://ender-blog.pages.dev/posts/news-2026-09-02-laravel-tackle/</link>
      <pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://ender-blog.pages.dev/posts/news-2026-09-02-laravel-tackle/</guid>
      <description>Laravel News 報導的新套件 Laravel Tackle，把 AI coding agent 直接裝進 Laravel App 變成 Artisan 指令——身為每天在寫 Laravel 的後端工程師，來聊聊這東西到底解決了什麼問題。</description>
      <content:encoded><![CDATA[<h2 id="今天看到的新聞">今天看到的新聞</h2>
<p>今天在滑 Laravel News 的時候，看到一篇滿有意思的文章，介紹一個叫做 <strong>Laravel Tackle</strong> 的套件。簡單講，它是把一個 AI coding agent 直接裝進你的 Laravel 專案裡，變成兩個 Artisan 指令：<code>ai:code</code>（互動式的 REPL，有 plan mode、slash 指令、可以丟圖片進去問）跟 <code>ai:run</code>（不用開終端機互動，直接丟一個任務進去，做完給你 exit code，還可以 <code>--output=json</code> 串進 pipeline）。作者是 Jordan Dalton，套件是建構在 <code>laravel/ai</code> 之上，預設用 Claude，但也可以透過 <code>AI_CODE_PROVIDER</code> 換成 OpenAI、Gemini、Groq，甚至接 Ollama 跑本地模型。</p>
<h2 id="為什麼我這個寫-laravel-的後端工程師會在意這則新聞">為什麼我這個寫 Laravel 的後端工程師會在意這則新聞</h2>
<p>我每天的工作就是在 Laravel 專案裡打滾，所以看到這則新聞第一個反應不是「哇 AI 又出新玩具了」，而是「這個 agent 到底能拿到什麼權限」。因為市面上一堆 AI coding agent 的做法都是外掛一個 CLI 工具，透過檔案系統或終端機去操作你的專案，你能不能信任它，很大程度取決於一份寫在 prompt 裡的「規則」——但 prompt 是可以被誘導繞過的。</p>
<p>Laravel Tackle 讓我比較有興趣的地方是，它把限制寫成 PHP code，而不是寫成 prompt 裡的一句話。文章裡特別提到：路徑限制、Artisan 指令白名單、每個 session 的花費上限，這些都是套件本身的程式邏輯在把關，不是靠模型自己乖乖聽話。這個設計思路其實跟我們寫後端 API 在做權限控管的邏輯一模一樣——你不會把「這個使用者不能刪除別人的資料」這種規則寫在文件裡叫大家自己遵守，你會寫在 middleware 或 policy 裡面用程式碼強制擋下來。AI agent 要在正式環境裡被信任，走的也是同一條路。</p>
<p>另外一個讓我覺得「這才是重點」的功能，是它提到的 self-healer：會去監看失敗的 queue job 跟排程任務，在一個獨立的 worktree 裡面修好，然後開一個 PR 讓人審。這個流程設計得很保守——它不會直接把修好的東西推上 production，而是走 PR 流程讓人看過再合併。這跟我自己維護排程任務時的直覺很像：凌晨三點壞掉的 queue job，与其等我早上起來手動查 log，不如讓機器先把可能的修法準備好，但最後合不合併，人還是要看一眼。</p>
<h2 id="結語">結語</h2>
<p>短期內我應該不會馬上把這種 AI agent 接進正式的 production 專案，但這種「把 agent 的能力邊界寫進程式碼、而不是寫進 prompt」的做法，我覺得是接下來這類工具能不能被工程團隊真的信任的關鍵，值得繼續關注。</p>
<h2 id="消息來源">消息來源</h2>
<ul>
<li><a href="https://laravel-news.com/laravel-tackle">Laravel Tackle: Run an AI Coding Agent in Your Laravel App</a> — Laravel News</li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
