ทีม release ของ PHP ประกาศ RC5 พร้อมย้ำว่ายังเป็นรุ่นทดสอบ ตามตารางนี่คือ RC รอบสุดท้ายก่อนตัวจริง จึงเหลือเวลาไม่ถึงสองสัปดาห์ที่จะเจอปัญหาก่อนคนอื่น
ถ้าเว็บยังอยู่บน PHP 8.2 เรื่องที่รีบกว่าคือ 8.2 จะหมด security support วันที่ 31 ธ.ค. 2569 อ่านอายุ support ของ PHP แต่ละเวอร์ชันก่อนได้ครับ
ลองรัน PHP 8.6 ได้โดยไม่แตะเครื่องจริง
| ที่ใช้อยู่ | วิธีลอง | สิ่งที่ควรรู้ |
|---|---|---|
| GitHub Actions | setup-php ตั้ง php-version: '8.6' |
ได้ nightly จาก branch PHP-8.6 ไม่ใช่ tag RC5 ตรง ๆ |
| Docker | image php:8.6-rc-cli |
README ของ image ยังระบุเป็น RC4 และต้องเพิ่ม Composer กับ extension เอง |
| Windows กับ Laragon หรือ XAMPP | zip จากหน้า pre-release builds | แตกไว้โฟลเดอร์แยก แล้วเรียก php.exe ตัวนั้นตรง ๆ |
| shared hosting | รอผู้ให้บริการเพิ่มตัวเลือก | ยังไม่ต้องรีบ ลองบนเครื่องตัวเองก่อนได้ |
ถ้าโปรเจกต์มี test อยู่แล้ว ทางที่ง่ายที่สุดคือเพิ่ม 8.6 เข้า matrix ของ CI แล้วให้ชุดนี้ล้มได้โดยไม่บล็อกงาน
jobs:
tests:
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.php == '8.6' }}
strategy:
fail-fast: false
matrix:
php: ['8.5', '8.6']
steps:
- uses: actions/checkout@v4
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
- run: composer install --no-interaction
- run: php artisan test
composer install บอกได้ก่อนว่า package ไหนยังไม่พร้อม
composer install บน 8.6 จะหยุดทันทีถ้า package ตัวไหนจำกัดเวอร์ชัน PHP ไว้ต่ำกว่านั้น เราจึงเห็นรายชื่อที่ต้องรอหรือต้องอัปเดตตั้งแต่ขั้นแรก
ฝั่ง Laravel 13 เอง composer.json ของ framework ตั้ง ^8.3 จึงไม่ได้ปิดกั้น 8.6 แต่ตาราง support ในเอกสารยังระบุถึงแค่ PHP 8.5 ระหว่างนี้จึงยังนับเป็นการลองล่วงหน้า
ถ้าอยากรัน test ต่อทั้งที่ยังมี package ค้างอยู่ ให้ข้ามเฉพาะเพดานเวอร์ชันของ PHP
composer install --ignore-platform-req=php+
เครื่องหมาย + ทำให้ Composer ข้ามแค่ขอบบน ส่วนขอบล่างยังตรวจตามปกติ ใช้สำหรับลองเท่านั้น ไม่ควรเอาไป deploy
โค้ดเก่าอาจขึ้น deprecation ชุดใหญ่
RFC deprecation ของ 8.6 ผ่านมาหลายสิบข้อ และมีแผนเอาออกจริงใน PHP 9 ตัวที่น่าจะเจอในโค้ดทั่วไปมีดังนี้
| ของเดิม | ใช้แทน |
|---|---|
is_integer(), is_long() |
is_int() |
is_double() |
is_float() |
doubleval() |
floatval() |
spl_object_hash() |
spl_object_id() |
SplFileObject::fgetcsv(), fputcsv(), setCsvControl(), getCsvControl() |
ฟังก์ชัน fgetcsv() กับ fputcsv() |
return ในบล็อก finally |
ย้าย return ออกนอก finally |
ตั้งชื่อฟังก์ชันหรือคลาสว่า is หรือ let |
เปลี่ยนชื่อ |
เราอาจเจอข้อ SplFileObject ในงาน import CSV ส่วนฟังก์ชัน fgetcsv() ปกติกับ SplFileObject::READ_CSV ยังใช้ได้เหมือนเดิม
deprecation ไม่ทำให้เว็บล่ม แค่เตือน ถ้าอยากเก็บรายการไว้ไล่แก้ทีเดียว ตั้ง LOG_DEPRECATIONS_CHANNEL ใน .env ให้ชี้ไปที่ channel ของ log ได้เลย
session ค่าเริ่มต้นใหม่กระทบโค้ดที่ใช้ session_start()
PHP 8.6 เปลี่ยนค่าเริ่มต้นของ session สามตัว
| ค่า | เดิม | ใหม่ | ผลที่เห็น |
|---|---|---|---|
session.use_strict_mode |
0 |
1 |
ไม่รับ session ID ที่ server ไม่ได้สร้าง |
session.cookie_httponly |
0 |
1 |
JavaScript อ่าน cookie ของ session ไม่ได้ |
session.cookie_samesite |
ไม่ได้ตั้ง | Lax |
ไม่ส่ง cookie ไปกับ POST ที่มาจากเว็บอื่น |
แอป Laravel ใช้ session กับ cookie ของตัวเองตาม config/session.php เรื่องนี้จึงไม่ค่อยกระทบ ส่วนที่ควรดูคือเว็บ PHP เก่าที่เรียก session_start() ตรง ๆ
ตัวอย่างที่น่าเช็คคือหน้าที่รับ POST กลับมาจาก payment gateway เมื่อเบราว์เซอร์ไม่ส่ง cookie ของ session ไปด้วย ระบบจะมองเหมือนผู้ใช้หลุดจากระบบหลังจ่ายเงิน ถ้าจำเป็นต้องรับแบบนี้ ให้ตั้ง session.cookie_samesite เป็น None คู่กับ session.cookie_secure=1 ทั้งนี้ค่าที่ตั้งไว้เองใน php.ini ยังมีผลเหนือค่าเริ่มต้นเหมือนเดิม
พฤติกรรมอื่นที่อาจเห็นตอนรันจริง
UPGRADING ของ RC5 มีอีกหลายข้อ ตัวที่น่าจะเจอในงานทั่วไปคือ
trim(),ltrim(),rtrim()ตัดอักขระ form feed (\f) ด้วยโดยไม่ต้องระบุfile_exists(),is_file(),filesize()โยนValueErrorถ้าชื่อไฟล์มี NUL byte เดิมเราอาจไม่เคยต้องดักกรณีนี้array_filter(),pathinfo(),scandir(),number_format()โยนValueErrorเมื่อได้อาร์กิวเมนต์ที่ไม่ถูกต้องpreg_grep()คืนfalseเมื่อ PCRE ทำงานผิดพลาด แทนการคืน array ไม่ครบfclose(),file_put_contents(),copy()คืนfalseเมื่อ flush หรือปิดไฟล์ไม่สำเร็จ
ใครที่เคยทดสอบบน RC ช่วงต้นไปแล้วควรรันอีกรอบ เพราะ RC3 แก้หลายเรื่อง เช่น error_reporting ใน Fiber, นาฬิกาของ hrtime() และ array_map() ในไฟล์ strict_types
ของใหม่ที่รออยู่ใน PHP 8.6
clamp(101, min: 0, max: 100); // 100
$makeSlug = str_replace(' ', '-', ?); // partial function application
$delay = Duration::fromMilliseconds(100)->multiplyBy(2 ** $attempt);
นอกจาก clamp(), partial function application และคลาส Time\Duration ยังมี enum SortDirection กับค่าเริ่มต้นของ readonly property รายการเต็มอยู่ในสรุป PHP 8.6 ของ Laravel News ส่วนลิงก์ดาวน์โหลดกับวิธีรายงานบั๊กอยู่ในโพสต์ต้นฉบับของ PHP News ครับ






