پرسشی که در سال های اخیر زیاد از من پرسیده می شود این است: «آیا لازم است سایت را به PHP ۸ ارتقا دهم؟» پشت این پرسش، دغدغه ای منطقی نهفته است: نگرانی از این که ارتقا، سایتی که سال ها سالم کار کرده را از کار بیندازد. تجربه ی من در پروژه های واقعی این است که این نگرانی، در بیش از نیمی از موارد، بی جا نیست — اما راه حل درست، «ارتقا ندهیم» نیست؛ راه حل درست، «آگاهانه ارتقا دهیم» است. برای این آگاهی، اولین قدم، شناخت دقیق تفاوت های بین دو نسخه است. در این مقاله، همان تفاوت ها را از زاویه ی عملی و بر پایه ی تجربه ی کار روی ده ها سایت باز می کنم.

اگر تازه با PHP آشنا شده اید، پیشنهاد می کنم پیش از این مقاله، آموزش PHP از صفر برای مبتدیان را بخوانید. و اگر می خواهید بدانید این تفاوت ها در بستر وردپرس چطور بروز می کنند، توسعه وردپرس چیست و از کجا شروع کنیم مکمل خوبی است.

نمای کلی: از PHP ۷ تا PHP ۸، چه اتفاقی افتاد؟

PHP ۷ در سال ۲۰۱۵ منتشر شد و شاید بتوان گفت بزرگ ترین جهش تاریخ این زبان بود. نسخه های ۵.x، سال ها کندی و ناامنی را تحمل کرده بودند؛ PHP ۷ با بازنویسی موتور اجرایی (موتور Zend)، سرعت را دو برابر کرد و با معرفی Scalar Type Hints و Return Types، پایه ی یک زبان مدرن را بنا کرد. نسخه های فرعی ۷.۱ تا ۷.۴، ویژگی های تکمیلی را اضافه کردند: Nullable Types، Arrow Functions، Typed Properties.

PHP ۸ در نوامبر ۲۰۲۰ منتشر شد و سه سال بعد، PHP 8.1، PHP 8.2 و PHP 8.3 را در پی داشت. مسیر تکاملی PHP ۸، دو محور اصلی دارد: از یک سو، بهبود کارایی و اضافه کردن ویژگی های سینتکسی که کد را کوتاه تر و خواناتر می کنند؛ از سوی دیگر، سخت گیرتر شدن در برابر کدهای قدیمی و ناسازگار. همین دو محور، دلیل نگرانی بسیاری از توسعه دهندگان است: ارتقا به PHP ۸، هم پاداش دارد و هم هزینه.

نکته ی کلیدی که درک آن، مبنای همه ی تصمیم های بعدی است: PHP ۷ امروز دیگر پشتیبانی امنیتی نمی گیرد. این جمله را باید جدی گرفت. PHP 7.4 در نوامبر ۲۰۲۲ به پایان چرخه ی پشتیبانی رسید و بعد از آن، هر آسیب پذیری جدیدی که کشف شود، در PHP 7.4 وصله نمی شود. برای سایت هایی که با اطلاعات کاربران یا تراکنش های مالی سروکار دارند، ماندن روی PHP ۷ یک ریسک امنیتی جدی است — موضوعی که در بهترین افزونه های امنیتی وردپرس هم به آن اشاره کرده ام.

ارتقا از PHP ۷ به PHP ۸، در واقع انتخاب بین دو هزینه است: هزینه ی امروز (مهاجرت آگاهانه) و هزینه ی فردا (ماندن روی نسخه ای بدون پشتیبانی). تجربه ی من این است که هزینه ی امروز، همیشه کمتر است.

تفاوت اول: سرعت و کارایی

سرعت، شاید ملموس ترین تفاوت بین دو نسخه باشد. PHP ۸ از نظر کارایی، بهبود محسوسی نسبت به PHP ۷ دارد. طبق مستندات رسمی و تجربه ی پروژه های خودم، تفاوت سرعت بین این دو نسخه، در بارهای معمولی بین ۱۰ تا ۲۵ درصد است. در بارهای خاص (به ویژه محاسبات ریاضی و پردازش داده)، تفاوت می تواند بیشتر باشد.

سه لایه ی اصلی که این بهبود در آن ها اتفاق افتاده:

  • بهبود در JIT: که در بخش بعدی به تفصیل باز می کنم.
  • بهبود در موتور اجرایی: بهینه سازی در opcache، مدیریت بهتر حافظه، و کاهش overhead در فراخوانی توابع.
  • بهبود در کتابخانه های استاندارد: بازنویسی برخی از توابع داخلی با الگوریتم های سریع تر.

در پروژه های وردپرسی که با آن ها کار کرده ام، ارتقا از PHP 7.4 به PHP 8.1 معمولا این نتایج را به همراه داشته: کاهش TTFB بین ۱۰ تا ۲۰ درصد، کاهش مصرف CPU هاست بین ۱۵ تا ۳۰ درصد، و کاهش زمان رندر صفحات پیچیده (مثل صفحه ی محصول یا آرشیو) بین ۲۰ تا ۴۰ درصد. این اعداد، در شرایط مختلف متفاوت است؛ سایت هایی که از کش استفاده می کنند، بهبود کمتری می بینند؛ سایت هایی که کوئری های سنگین دارند، بهبود بیشتری می بینند.

اگر می خواهید این بهبود را در سایت خودتان اندازه بگیرید، پیش و پس از ارتقا، سه عدد را ثبت کنید: TTFB، مصرف CPU هاست، و LCP. ابزارهای دقیق در ابزارهای تست سرعت سایت کدامند فهرست شده اند.

JIT: بزرگ ترین ویژگی PHP ۸

JIT (Just-In-Time Compiler) پرچمدارترین ویژگی PHP ۸ است و در پروژه های واقعی، بیشترین بحث را هم ایجاد کرده. JIT یعنی PHP می تواند بخش هایی از کد شما را در زمان اجرا به کد ماشین ترجمه کند، به جای اینکه هر بار آن را از صفر تفسیر کند. این کار، در محاسبات سنگین، سرعت را چند برابر می کند.

اما یک نکته ی مهم که در پروژه های خودم به آن برخورده ام: JIT در بارهای وب معمولی، تأثیر ناچیزی دارد. چرا؟ چون کد وب، معمولاً بیشتر زمان خود را در خواندن از دیتابیس، ورودی/خروجی شبکه، و رندر HTML می گذراند تا در محاسبات ریاضی. JIT وقتی می درخشد که کد شما حلقه های سنگین ریاضی یا پردازش داده در حجم بالا داشته باشد — مثل محاسبات علمی، رمزنگاری، یا الگوریتم های پیچیده.

پس آیا JIT برای سایت های وردپرسی بی فایده است؟ نه، دقیقاً. سه استفاده ی عملی از JIT در بستر وردپرس:

  1. در اجرای cron های سنگین: اگر سایت شما پردازش داده ی سنگینی (مثل همگام سازی محصولات با سیستم بیرونی) دارد، JIT می تواند زمان اجرا را کاهش دهد.
  2. در افزونه های محاسباتی: مثل افزونه هایی که گزارش های تحلیلی می سازند یا قیمت ها را محاسبه می کنند.
  3. در محیط های با ترافیک بالا: حتی بهبود چند درصدی در هر درخواست، در مقیاس میلیون ها درخواست روزانه، تفاوت محسوسی می سازد.

یک توصیه ی عملی: در هاست های اشتراکی، JIT معمولاً با تنظیمات پیش فرض بهینه فعال است. در VPS یا سرور اختصاصی، باید JIT را صریحاً فعال کنید و پارامترهای opcache را تنظیم کنید. این تنظیمات، در برخی از پروژه های خودم، تفاوت بین «صرفه جویی محسوس در CPU» و «بدون تغییر» را ساخته است.

تفاوت دوم: ویژگی های سینتکسی جدید

در کنار سرعت، PHP ۸ مجموعه ی بزرگی از ویژگی های سینتکسی را معرفی کرده که کد را کوتاه تر، خواناتر، و امن تر می کنند. این ویژگی ها، در کار روزمره ی یک توسعه دهنده ی PHP، بیشترین تفاوت را حس می کنند. در ادامه، مهم ترین شان را با مثال باز می کنم. اگر با مبانی PHP آشنا نیستید، پیشنهاد می کنم پیش از ادامه، آموزش PHP از صفر برای مبتدیان را ببینید.

Union Types و بهبود سیستم نوع

در PHP ۷، زمانی که می خواستید برای یک پارامتر، بیش از یک نوع داده را مجاز کنید، باید از docblock استفاده می کردید:

/** @var int|string $id */
function find( $id ) { /* ... */ }

در PHP ۸، این محدودیت برداشته شده و می توانید نوع را مستقیماً اعلام کنید:

function find( int|string $id ): string { /* ... */ }

PHP خودش در زمان اجرا، نوع را بررسی می کند و اگر پارامتر از نوع نامجاز باشد، خطای TypeError می دهد. تجربه ی من این است که این ویژگی، خطاهای پنهان را قبل از اینکه به مرحله ی اجرا برسند، کشف می کند. در پروژه های بزرگ، همین یک ویژگی، می تواند ساعت ها وقت دیباگ را نجات دهد. موضوع مشابه در بحث نوشتن کد PHP امن برای وردپرس هم به عنوان یکی از پایه های کد امن مطرح است.

Named Arguments و سازنده ی جادویی

Named Arguments یک ویژگی ساده اما کاربردی است. در PHP ۷، اگر تابعی چندین پارامتر داشت و شما می خواستید فقط پارامتر آخر را مقداردهی کنید، باید همه ی پارامترهای قبل از آن را هم می نوشتید. در PHP ۸، می توانید با نام، پارامتر موردنظر را مقداردهی کنید:

function create_user( string $name, string $email, string $role = 'user', bool $active = true ) { /* ... */ }

// در PHP 7، باید همه ی پارامترها را بنویسید:
create_user( 'علی', 'ali@example.com', 'user', false );

// در PHP 8، می توانید فقط پارامتر موردنظر را بنویسید:
create_user( 'علی', 'ali@example.com', active: false );

مزیت اصلی این ویژگی، در خوانایی کد و در پایداری در برابر تغییرات است. اگر بعداً ترتیب پارامترهای تابع تغییر کند، کدهایی که از Named Arguments استفاده می کنند، بدون تغییر کار می کنند. تجربه ی من: در پروژه هایی که کتابخانه های بیرونی استفاده می کنم، Named Arguments تفاوت بزرگی در راحتی کار می سازد.

Constructor Property Promotion

این ویژگی، کد کلاس های شی گرا را کوتاه تر و خواناتر می کند. در PHP ۷، برای یک کلاس ساده با سه ویژگی، باید این کد طولانی را می نوشتید:

class User {
    private string $name;
    private string $email;
    private string $role;

    public function __construct( string $name, string $email, string $role ) {
        $this->name  = $name;
        $this->email = $email;
        $this->role  = $role;
    }
}

در PHP ۸، همین کلاس را می توانید در چند خط بنویسید:

class User {
    public function __construct(
        private string $name,
        private string $email,
        private string $role,
    ) {}
}

این ویژگی، در پروژه هایی که کلاس های داده ای زیادی دارند (مثل DTO یا Value Object)، تفاوت بزرگی در حجم کد و سرعت نوشتن می سازد. اگر با شی گرایی آشنا نیستید، این ویژگی به تنهایی دلیلی برای یادگیری آن است؛ مسیر پیشنهادی من در آموزش PHP از صفر و در بحث ساختار کلاس ها آمده است.

Nullsafe Operator و Match Expression

Nullsafe Operator یکی از ویژگی هایی است که تجربه ی من نشان می دهد بیشترین بازخورد مثبت را از توسعه دهندگان گرفته. در PHP ۷، اگر می خواستید به یک ویژگی آبجکت دسترسی داشته باشید که ممکن بود null باشد، باید این کد را می نوشتید:

$country = null;

if ( $user !== null ) {
    if ( $user->getAddress() !== null ) {
        $country = $user->getAddress()->getCountry();
    }
}

در PHP ۸، این کد به یک خط تبدیل می شود:

$country = $user?->getAddress()?->getCountry();

حرف ? قبل از -> می گوید: اگر مقدار null بود، زنجیره را قطع کن و نتیجه null بده. این ویژگی، در کدی که با داده های اختیاری کار می کند (مثل داده های دریافتی از API)، تفاوت چشمگیری در خوانایی می سازد.

Match Expression هم یک جایگزین مدرن برای switch است. در PHP ۷:

switch ( $status ) {
    case 'active':
        $label = 'فعال';
        break;
    case 'inactive':
        $label = 'غیرفعال';
        break;
    default:
        $label = 'نامشخص';
}

در PHP ۸:

$label = match ( $status ) {
    'active'   => 'فعال',
    'inactive' => 'غیرفعال',
    default     => 'نامشخص',
};

مزیت match در این است که مقدار برمی گرداند (نیاز به break ندارد) و مقایسه ی دقیق تر (با ===) انجام می دهد. تجربه ی من: در کدی که با وضعیت ها (status) کار می کند، match تفاوت چشمگیری در خوانایی می سازد.

Attributes در برابر Annotations

در PHP ۷ و کتابخانه های آن (مثل Doctrine یا Symfony)، برای اضافه کردن متادیتا به کد، از Annotations در docblock استفاده می شد:

/**
 * @Route( '/users/{id}', methods={'GET'} )
 */
public function show( $id ) { /* ... */ }

مشکل این رویکرد: Annotations در واقع کامنت هستند. PHP آن ها را اجرا نمی کند؛ کتابخانه های واسط، با پارس کردن کامنت ها، آن ها را به کد تبدیل می کنند. این کار، کندی و پیچیدگی را به همراه دارد.

در PHP ۸، Attributes جایگزین رسمی Annotations شدند:

#[Route( '/users/{id}', methods: ['GET'] )]
public function show( $id ) { /* ... */ }

Attributes بخشی از زبان هستند، نه کامنت. این یعنی سریع تر، استانداردتر، و کم خطاتر. اگر با فریم ورک هایی مثل Symfony یا لاراول کار می کنید، این تغییر، در نسخه های جدید آن ها پیاده شده است.

در PHP ۸، زبان به سمتی می رود که «کد خوانا» همیشه برنده است. هر ویژگی جدید، سعی می کند آن چیزی که در ذهن شما هست، به کوتاه ترین شکل در کد بیان شود.

تفاوت سوم: تغییرات ناسازگار (Breaking Changes)

حالا می رسیم به بخشی که اکثر توسعه دهندگان را نگران می کند: تغییراتی که کدهای قدیمی را می شکنند. این تغییرات، دلیل اصلی طولانی شدن مهاجرت هستند، اما در تجربه ی من، اگر آگاهانه مدیریت شوند، مانع جدی نیستند. سه دسته ی اصلی تغییرات ناسازگار:

حذف و منسوخ شدن توابع قدیمی

PHP ۸ مجموعه ای از توابع و قابلیت ها را که در نسخه های قبل deprecated شده بودند، حذف کرد. مهم ترین شان:

  • توابع each(): که برای پیمایش آرایه استفاده می شد. جایگزین مدرن: foreach.
  • تابع create_function(): که برای ساخت توابع پویا استفاده می شد. جایگزین: توابع ناشناس (Closures).
  • افزونه ی mysql_*: که سال ها بود منسوخ بود. جایگزین: mysqli یا PDO. اگر با وردپرس کار می کنید، افزونه های قدیمی ممکن است همچنان از این توابع استفاده کنند. این یکی از رایج ترین دلایل خطاهای ۵۰۰ در حین مهاجرت است؛ مسیر تشخیص در خطای ۵۰۰ وردپرس چیست و چگونه رفع می شود آمده است.
  • رفتار توابع is_callable() و strpos(): که در موارد لبه ای تغییر کرده اند.

در پروژه های خودم، قبل از هر مهاجرت، یک اسکن سریع انجام می دهم: کد قالب، افزونه ها، و کدهای سفارشی را با یک ابزار static analysis (مثل PHPStan یا Rector) بررسی می کنم. این اسکن، در چند دقیقه، فهرست تمام نقاطی که نیاز به تغییر دارند را می دهد.

تغییر در مدیریت خطا

PHP ۸ در مدیریت خطا نیز تغییرات ناسازگار داشته. مهم ترین شان:

  • تبدیل برخی Warning ها به Error: مثلاً فراخوانی متد روی null، در PHP ۷ فقط Warning می داد؛ در PHP ۸، خطای Fatal می دهد. این تغییر، در ظاهر سخت گیرانه به نظر می رسد، اما در عمل، باگ های پنهان را زودتر لو می دهد.
  • تغییر در پیام های خطا: که در ظاهر جزئی است، اما اگر کد شما به متن خطا وابسته باشد (مثل Regular Expression روی پیام خطا)، می تواند مشکل ساز شود.
  • تغییر در رفتار throw: که اکنون یک expression است، نه statement. این تغییر، انعطاف بیشتری می دهد اما کدهای قدیمی ممکن است نیاز به تغییر داشته باشند.

در تجربه ی من، اگر با خطاهای سطح Warning مواجه شده اید، این احتمال هست که با PHP ۸ به خطای Fatal تبدیل شوند. پیشنهاد من: قبل از مهاجرت، همه ی Warning های PHP 7.4 را در debug.log بررسی کنید و آن ها را به ریشه رفع کنید. مسیر فعال سازی لاگ در روش پیدا کردن افزونه یا قالب مشکل ساز آمده است.

تفاوت چهارم: بهبود امنیت

امنیت، در PHP ۸ بهبود محسوسی داشته. اگر با سایت هایی کار می کنید که داده ی کاربران یا تراکنش مالی دارند، این بهبودها به تنهایی دلیل کافی برای ارتقا هستند.

مهم ترین بهبودهای امنیتی:

  • Saner Type System: با Union Types و Strict Types، بسیاری از باگ های امنیتی ناشی از نوع اشتباه داده، در مرحله ی اجرا کشف می شوند.
  • بهبود در رمزنگاری: توابع رمزنگاری، با الگوریتم های مدرن به روزرسانی شده اند. اگر از password_hash() استفاده می کنید، در PHP ۸ از الگوریتم های قوی تری بهره می گیرید.
  • سخت گیری در برابر Deserialization: که منبع رایج بسیاری از حملات امنیتی است. این موضوع در بحث امنیت وب چیست و چه اصولی دارد به تفصیل باز شده است.
  • پشتیبانی امنیتی فعال: برخلاف PHP ۷ که پشتیبانی امنیتی نمی گیرد، PHP ۸ فعال است و آسیب پذیری های جدید در سریع ترین زمان وصله می شوند.

در پروژه های خودم، بعد از هر مهاجرت به PHP ۸، تفاوت را در لاگ های امنیتی می بینم: حملات Brute Force و تزریق کد، که در PHP ۷ گاهی موفق می شدند، در PHP ۸ معمولاً در همان مرحله ی اول مسدود می شوند. اگر می خواهید سایت شما در برابر حملات مقاوم تر شود، PHP ۸ یک لایه ی دفاعی اضافه است — موضوعی که در بهترین افزونه های امنیتی وردپرس هم به عنوان یکی از پایه ها مطرح شده است.

تفاوت در بستر وردپرس: چه معنایی دارد؟

حالا سوال عملی: این تفاوت ها، در بستر وردپرس چه معنایی دارند؟ بر اساس تجربه ی من از پروژه های وردپرسی:

معیارPHP 7.4PHP 8.1+
حداقل نسخه ی موردنیاز وردپرس5.3وردپرس ۵.۹ به بالا به PHP 8.0 پیشنهاد می کند
پشتیبانی امنیتیمتوقف (نوامبر ۲۰۲۲)فعال
سرعت در بستر وردپرسمبنای مقایسه۱۵ تا ۳۰ درصد بهتر
سازگاری افزونه های مدرنمحدودبه طور کامل
سازگاری با ووکامرس مدرنمحدودبه طور کامل
پشتیبانی قالب های مدرنمحدودبه طور کامل

نکته ی عملی: از نسخه ی وردپرس ۵.۹ به بعد، سازگاری با PHP 8.0 در هسته ی وردپرس بررسی می شود. اگر سایت شما روی وردپرس مدرن است، PHP ۸ انتخاب طبیعی است. اگر روی وردپرس قدیمی هستید، اول وردپرس را به روز کنید، بعد PHP را.

در بستر ووکامرس، تفاوت مهم تر است: نسخه های جدید ووکامرس (از ۶ به بالا) به طور کامل با PHP 8.x سازگارند و در نسخه های بعدی، PHP 8.x را به عنوان حداقل نسخه توصیه می کنند. اگر فروشگاه ووکامرس دارید و هنوز روی PHP 7.4 هستید، در چند ماه آینده، ممکن است با محدودیت های جدی روبه رو شوید. مسیر به روزرسانی ووکامرس در رفع خطاهای رایج ووکامرس آمده است.

مهاجرت از PHP ۷ به PHP ۸: پروتکل من

در پروژه های خودم، مهاجرت PHP را با یک پروتکل مشخص انجام می دهم. این پروتکل، از ده ها پرونده ی موفق و چند پرونده ی نیمه موفق شکل گرفته:

گام اول — بکاپ کامل: پیش از هر تغییری، از فایل ها و دیتابیس بکاپ کامل. اگر بکاپ تست بازیابی نشده، بکاپ نیست. راهنما در چگونه از سایت وردپرسی بکاپ بگیریم.

گام دوم — اسکن سازگاری: از یک ابزار تحلیل ایستا (مثل PHP Compatibility Checker یا PHPStan) استفاده کنید تا نقاط ناسازگار را در قالب، افزونه ها، و کد سفارشی پیدا کنید. این اسکن، معمولاً در چند دقیقه فهرست کامل را می دهد.

گام سوم — تست در محیط استیجینگ: اول روی استیجینگ یا محیط لوکال، نسخه ی PHP را ارتقا دهید و سایت را به طور کامل تست کنید. سه الگوی صفحه (خانه، نوشته، برگه) و پنج عملیات کلیدی (ورود، انتشار نوشته، آپلود تصویر، ثبت سفارش، ارسال فرم) را چک کنید.

گام چهارم — رفع خطاها: خطاها را یک به یک رفع کنید. برای هر خطا، ریشه را در debug.log پیدا کنید و نه فقط علامت را بپوشانید. اگر با خطای Fatal روبه رو شدید، مسیر تشخیص در رفع خطای سفید شدن صفحه وردپرس و خطای ۵۰۰ وردپرس چیست و چگونه رفع می شود آمده است.

گام پنجم — انتقال به سایت زنده: در ساعات کم ترافیک، ارتقا را روی سایت زنده اعمال کنید. بلافاصله، پنج عدد کلیدی (TTFB، LCP، مصرف CPU، تعداد خطا، امتیاز PageSpeed) را اندازه بگیرید و با قبل مقایسه کنید.

گام ششم — پایش ۴۸ ساعته: در دو روز بعد، سایت را زیر نظر بگیرید. اگر خطای جدیدی در debug.log نیست، ارتقا موفق بوده است.

این پروتکل، در پروژه های خودم، در بیش از نود درصد موارد جواب داده است. در ده درصد باقی مانده، مسئله ی ناسازگاری یک افزونه ی خاص بود که با به روزرسانی یا جایگزینی حل شد.

کدام سایت ها باید ارتقا دهند و کدام ها نه

تصمیم درباره ی ارتقا، برای همه ی سایت ها یکسان نیست. بر اساس تجربه ی من:

سایت هایی که باید در اولویت ارتقا باشند:

  • سایت هایی که با داده ی کاربران یا تراکنش مالی سروکار دارند (فروشگاه، باشگاه مشتریان، سامانه های آموزشی).
  • سایت هایی که به طور فعال توسعه می یابند و افزونه های جدید اضافه می کنند.
  • سایت هایی که روی سرعت حساس هستند و از سرعت، بهره می برند.

سایت هایی که می توانند ارتقا را به تعویق بیندازند:

  • سایت های آرشیوی که دیگر توسعه نمی یابند و تنها برای نمایش محتوای قدیمی باقی مانده اند.
  • سایت هایی که روی هاست اشتراکی با PHP 7.4 محدود شده اند و امکان ارتقا ندارند — اما در این حالت، اولویت باید مهاجرت به هاست بهتر باشد؛ راهنما در هاست چیست و چگونه انتخاب کنیم.
  • سایت هایی که به یک افزونه ی قدیمی وابسته اند که هیچ جایگزینی برایش وجود ندارد و خودش با PHP ۸ سازگار نیست — اما در این حالت، باید به فکر راه حل بلندمدت برای آن افزونه باشید.

در هر حال، یک نکته ی کلیدی: ماندن روی PHP 7.4، در بلندمدت یک انتخاب پایدار نیست. حتی اگر امروز مشکلی ایجاد نکند، در شش ماه یا یک سال آینده، احتمالاً با محدودیت های جدی روبه رو خواهید شد: افزونه هایی که دیگر پشتیبانی نمی شوند، قالب هایی که به روز نمی شوند، و احتمالاً هاست هایی که به طور خودکار PHP ۷ را حذف می کنند.

اشتباهات رایج در مهاجرت

اشتباهپیامدروش درست
ارتقای مستقیم روی سایت زندهریسک قطعی سایتاستیجینگ یا لوکال اول
نداشتن بکاپ پیش از ارتقاامکان بازگشت وجود نداردبکاپ کامل و تست شده
نادیده گرفتن هشدارهای PHP 7.4تبدیل به خطای Fatal در PHP 8رفع Warning ها پیش از ارتقا
پرش از PHP 7.4 به PHP 8.3پرش از چند نسخه، ریسک بیشترارتقای مرحله ای
نادیده گرفتن افزونه های قدیمیناسازگاری و خرابیبه روزرسانی یا جایگزینی پیش از ارتقا
فعال نکردن debug.log در حین تستنامشخص ماندن مقصرفعال سازی لاگ از روز اول

یک اشتباه ظریف که در دیدگاه ها زیاد می بینم: کاربران، ارتقای PHP را با به روزرسانی افزونه ها همزمان انجام می دهند. این کار، ریسک را دو برابر می کند و تشخیص را دشوار. توصیه ی من: اول افزونه ها را به روز کنید و دو هفته صبر کنید، بعد PHP را ارتقا دهید. این ترتیب، در بیش از نیمی از پرونده های خودم، تفاوت بین یک مهاجرت روان و یک مهاجرت پر دردسر را ساخته است.

آینده ی PHP و انتخاب های پیش رو

PHP، برخلاف باور رایج، زبانی است که به سرعت در حال تکامل است. PHP 8.1، 8.2 و 8.3 هر کدام ویژگی های مهمی اضافه کرده اند. جالب است که چرخه ی انتشار PHP، سالانه است و هر نسخه، تا سه سال پشتیبانی فعال و تا دو سال دیگر، پشتیبانی امنیتی می گیرد.

سه روند کلیدی که در سال های آینده در PHP دیده می شود:

  • تمرکز بر Type System: هر نسخه، سیستم نوع PHP را قوی تر می کند. هدف، کاهش باگ ها و افزایش خوانایی کد است.
  • تمرکز بر کارایی: JIT و بهینه سازی موتور، در نسخه های اخیر محور اصلی بوده اند. در نسخه های آینده، این روند ادامه می یابد.
  • امنیت پیش فرض: به جای اینکه توسعه دهنده خودش مسئول امنیت کد باشد، PHP سعی می کند در سطح زبان، رفتارهای ناامن را سخت تر کند.

برای توسعه دهندگان PHP، این یعنی یادگیری مداوم ضروری است. اگر به دنبال منابع به روز هستید، بهترین منابع یادگیری PHP در سال ۲۰۲۶ فهرست کاملی از منابع معتبر را در اختیار شما می گذارد.

خلاصه و پیشنهاد نهایی

تفاوت PHP ۷ و PHP ۸، در سه محور اصلی خلاصه می شود: سرعت (با بهبود ۱۵ تا ۳۰ درصدی)، ویژگی های سینتکسی (با معرفی Union Types، JIT، Named Arguments، Nullsafe Operator و ویژگی های دیگر)، و تغییرات ناسازگار (حذف توابع قدیمی، سخت گیری در مدیریت خطا، و پایان پشتیبانی امنیتی PHP ۷).

در بستر وردپرس، تفاوت این دو نسخه، در چهار لایه ظاهر می شود: سرعت سایت (محسوس در TTFB و LCP)، مصرف منابع هاست (کمتر)، سازگاری با افزونه های مدرن (بیشتر)، و امنیت (لایه ی دفاعی اضافه).

پیشنهاد نهایی من: اگر سایت شما روی PHP 7.4 است و روی هاستی کار می کند که امکان ارتقا دارد، همین ماه برنامه ی مهاجرت را بگذارید. اگر روی هاستی هستید که PHP 8.x را ارائه نمی دهد، اول مهاجرت به هاست بهتر را در نظر بگیرید. اگر سایت شما به یک افزونه ی قدیمی وابسته است که با PHP ۸ سازگار نیست، به فکر جایگزین یا راه حل بلندمدت برای آن افزونه باشید — چون در چند ماه آینده، نگه داشتن آن افزونه سخت تر خواهد شد.

و حالا یک پیشنهاد عملی که می توانید امشب انجام دهید: یک محیط لوکال با بکاپ دیتابیس سایت خود بسازید، PHP ۸.۱ را روی آن فعال کنید، و سایت را برای پانزده دقیقه زیر فشار تست بگذارید — سه صفحه، سه فرم، دو محصول. اگر آن پانزده دقیقه بدون خطا گذشت، مهاجرت واقعی برای شما یک پروژه ی نیم روزه است، نه یک ریسک بزرگ. اگر خطا داد، debug.log صادقانه به شما می گوید که کدام افزونه یا کدام خط کد، سنگ راه است. تفاوت بین این دو حالت، تفاوت بین «فردا صبح شروع می کنم» و «فردا صبح هنوز نگرانم» است.

اگر این مسیر را رفته اید و تجربه ی جالبی دارید — مثلاً یک افزونه ی خاص که در PHP ۸ رفتار متفاوتی داشته، یا یک روش هوشمندانه برای تست سازگاری که در این مقاله نبوده — همان تجربه را در دیدگاه ها بنویسید. مهاجرت های PHP، از آن دسته کارهایی هستند که هر کدام درس تازه ای می دهند؛ و آن درس، وقتی با جامعه به اشتراک گذاشته شود، ارزشش چند برابر می شود. اگر هم در حین مهاجرت با خطای ناگهانی روبه رو شدید، راهنمای جامع رفع خطاهای رایج وردپرس ایستگاه بعدی شماست. 🚀