فهرست مطالب (6)
PHP 8.5 در ۲۰ نوامبر ۲۰۲۵ منتشر شد. در ماههای اول، جواب کوتاه به سؤال «سایت را ببرم روی ۸.۵؟» این بود: «هنوز نه». تا اینکه تیم هستهٔ وردپرس در مه ۲۰۲۶ اعلام کرد وردپرس ۶.۹ و ۷.۰ بهطور کامل از PHP 8.5 پشتیبانی میکنند. برچسب «پشتیبانی آزمایشی» را هم برای همیشه کنار گذاشت.
پس هسته آماده است. سؤال واقعی حالا این است که افزونهها و کد خود شما آمادهاند یا نه، و چه چیزی در ۸.۵ ارزش استفاده دارد.
عملگر pipe: خواناتر، نه جادویی
مهمترین تغییر ظاهری ۸.۵ عملگر |> است. مقدار سمت چپ را به callable سمت راست میدهد و میشود زنجیره ساخت. مثال کلاسیکش ساختن slug از یک عنوان است:
$slug = $title
|> trim(...)
|> ( fn( $s ) => str_replace( ' ', '-', $s ) )
|> strtolower(...);
در کد وردپرس، جایی که بیشتر به کار میآید، زنجیرههای پاکسازی و تبدیل داده است. مثلاً تمیز کردن یک ورودی قبل از ذخیره:
$clean_tags = $raw_tags
|> ( fn( $s ) => explode( ',', $s ) )
|> ( fn( $a ) => array_map( 'sanitize_text_field', $a ) )
|> ( fn( $a ) => array_filter( $a ) )
|> array_values(...);
سه محدودیت مهم هم دارد:
- فقط یک پارامتر اجباری: هر callable در زنجیره باید دقیقاً یک پارامتر اجباری بگیرد، و مقدار همیشه بهعنوان اولین آرگومان داده میشود.
- بدون پارامتر ارجاعی: توابعی که پارامترشان by-reference است، مثل
array_pop، در زنجیره مجاز نیستند. - ناسازگاری با نسخههای قبل: کدی که
|>دارد روی PHP 8.4 و قبلتر اصلاً parse نمیشود. یعنی در افزونهای که برای عموم منتشر میکنید، هنوز وقتش نیست. حداقل PHP وردپرس 7.4 است و کاربران شما روی همهجور سروری هستند. در پروژههای اختصاصی که سرورش دست خودتان است، مشکلی نیست.
clone with: پایان متدهای with دستساز
اگر با شیءهای readonly کار میکنید، مثلاً value objectها در یک افزونهٔ پرداخت، clone حالا میتواند همزمان چند ویژگی را عوض کند:
final readonly class Money {
public function __construct(
public int $amount,
public string $currency,
) {}
public function withAmount( int $amount ): self {
return clone( $this, array( 'amount' => $amount ) );
}
}
قبلاً برای این کار یا باید سازنده را دوباره با همهٔ آرگومانها صدا میزدید، یا با Reflection ور میرفتید.
چیزهای کوچکی که هر روز به کار میآیند
- **
array_first()وarray_last():** اولین و آخرین مقدار آرایه را میدهند و برای آرایهٔ خالیnullبرمیگردانند. با??خیلی تمیز ترکیب میشوند. دیگر لازم نیستreset()وend()اشارهگر داخلی آرایه را جابهجا کنند. - **
#[\NoDiscard]:** اگر خروجی تابعی که با این attribute علامت خورده استفاده نشود، PHP هشدار میدهد. برای توابعی که یک شیء تغییریافته برمیگردانند و همه فکر میکنند خود شیء را تغییر دادهاند، عالی است. - افزونهٔ URI: کلاس
Uri\Rfc3986\Uriآدرسها را مطابق RFC 3986 و استاندارد WHATWG تجزیه میکند. برای اعتبارسنجی redirectها و webhookها، ازparse_urlقابلاعتمادتر است. - backtrace برای خطاهای fatal: خطاهایی مثل تمام شدن زمان اجرا حالا رد کامل اجرا را نشان میدهند. برای دیباگ cronهای سنگین ووکامرس، همین یک مورد ارزش ارتقا را دارد.
چه چیزهایی منسوخ شده
اینها را در افزونههای قدیمی، بهخصوص کدهایی که چند دست چرخیدهاند، زیاد میبینید:
- نامهای غیراستاندارد cast:
(boolean)،(integer)،(double)و(binary)منسوخ شدهاند. بهجایشان(bool)،(int)،(float)و(string)بنویسید. - عملگر backtick: استفاده از آن بهجای
shell_exec()منسوخ شده. اگر در افزونهای چنین چیزی دیدید، احتمالاً مشکل امنیتی بزرگتری هم در کار است. - null بهعنوان کلید آرایه: استفاده از
nullبهعنوان کلید آرایه یا درarray_key_exists()منسوخ شده. - پایان case با نقطهویرگول: پایان دادن
caseبا;بهجای:منسوخ شده. - **
__sleep()و__wakeup():** این دو soft-deprecated شدهاند و جایگزینشان__serialize()و__unserialize()است. - هشدارهای تازه: تبدیل float به int وقتی قابلنمایش نیست، و destructuring مقدار غیرآرایه، حالا هشدار میدهند.
هیچکدام سایت را از کار نمیاندازد، ولی لاگ را پر میکند. لاگ پر هم یعنی خطای واقعی بعدی را دیر میبینید.
ترتیبی که من برای ارتقا پیشنهاد میکنم
- اول بدانید روی چه نسخهای هستید. از «ابزارها › سلامت سایت › اطلاعات» نسخهٔ PHP را ببینید. حداقل نسخهٔ پیشنهادی وردپرس هنوز 8.3 است. اگر زیر آن هستید، اول به 8.3 یا 8.4 بروید.
- روی staging با هشدارهای کامل تست کنید.
WP_DEBUGوWP_DEBUG_LOGرا روشن کنید. مسیرهای حساس را از اول تا آخر اجرا کنید: پرداخت، ثبتنام، cronها و webhookها. بعد لاگ را بخوانید. - اسکن خودکار سازگاری بگیرید. ابزار PHPCompatibility روی PHPCS، با تنظیم نسخهٔ هدف ۸.۵، بیشتر موارد منسوخ را پیش از اجرا پیدا میکند.
- افزونههای تجاری را جدا بررسی کنید. بهخصوص افزونههایی که کدشان رمزگذاری شده؛ اینها معمولاً آخرین چیزیاند که با PHP تازه سازگار میشوند.
- ارتقای PHP را جدا از ارتقای وردپرس و افزونهها انجام دهید. وقتی سه چیز با هم عوض شوند و چیزی بشکند، نمیدانید تقصیر کدام بوده.
PHP 8.5 یک نسخهٔ انقلابی نیست، ولی پر از چیزهای کوچکی است که کد را تمیزتر و دیباگ را راحتتر میکند. اگر پروژهتان اختصاصی است و سرور دست خودتان است، الان وقت خوبی برای امتحانش روی staging است. اگر افزونهٔ عمومی مینویسید، از ویژگیهای تازهاش فعلاً فقط در شاخههایی استفاده کنید که Requires PHP آنها را واقعاً ۸.۵ گذاشتهاید.
منابع
$ ./request_review
همین مشکل را در فروشگاه خودتان دارید؟
توسعهدهنده ارشد WordPress و WooCommerce برای معماری، اتصال سیستمها و حل مسائل پیچیده production.
درخواست بررسی فنی
## دیدگاهها