یک نسخه جدید از زبان برنامهنویسی PHP با شماره ۸.۴ منتشر شده. شاید اسم PHP به گوشتون خورده باشه؛ این همون زبانیه که بخش بزرگی از اینترنت، از جمله سیستمهای معروفی مثل وردپرس، با اون کار میکنن. هر چند وقت یک بار، یک نسخه جدید از این زبان میاد که یک سری تغییرات و ویژگیهای تازه با خودش داره. این آپدیتها میتونن روی سرعت، امنیت و امکانات سایتها تاثیر بذارن.
این مقاله قراره یک راست بره سر اصل مطلب و خیلی خودمونی و ساده توضیح بده که توی PHP 8.4 چه خبره. قراره ببینیم چه چیزهای جدیدی بهش اضافه شده، چه چیزهایی در حال حذف شدنه و این تغییرات، مخصوصا برای کسایی که با وردپرس کار میکنن، چه معنیای میتونه داشته باشه. همچنین نگاهی به صحبتهای کاربرها و شرکتهای مختلف، مثل لاراول، پلسک و Kinsta، میندازیم تا ببینیم نظر اونها در مورد این نسخه جدید چیه.
ویژگیهای جدید PHP 8.4: چه چیزهایی تغییر کرده؟
نسخه ۸.۴ یک آپدیت بزرگ حساب میشه و کلی ویژگیهای جدید، بهبود عملکرد، رفع اشکالات و تمیزکاریهای کلی توش انجام شده. بیاین با هم این ویژگیها رو یکی یکی بررسی کنیم.
هوکهای پراپرتی (Property Hooks): خداحافظی با کدهای تکراری
یکی از بزرگترین تغییرات این نسخه، چیزیه به اسم «هوکهای پراپرتی». برای اینکه بفهمیم این چیه، بذارید یک مثال بزنیم. فرض کنید توی سایتتون یک کلاس برای «کاربر» دارید. این کاربر اسم کوچیک و اسم فامیل داره. شما معمولا این دو تا رو جدا ذخیره میکنید. حالا اگه بخواید اسم کامل کاربر رو نشون بدید، باید یک تابع (Function) بنویسید که هر بار اسم کوچیک و فامیل رو بگیره و به هم بچسبونه و به شما تحویل بده. به این تابع میگن «گِتِر» (Getter). حالا اگه بخواید اسم کامل رو تغییر بدید، باید یک تابع دیگه به اسم «سِتِر» (Setter) بنویسید که اسم کامل رو بگیره، اون رو به دو بخش اسم کوچیک و فامیل تقسیم کنه و بعد ذخیره کنه. این یعنی برای هر چیزی کلی کد تکراری باید بنویسید.
هوکهای پراپرتی این مشکل رو حل میکنن. با این ویژگی، شما میتونید برای یک متغیر (Property) مثل «اسم کامل»، رفتار خوندن (get) و نوشتن (set) رو مستقیم تعریف کنید. دیگه نیازی به نوشتن تابعهای جداگونه نیست.
برای مثال، کد زیر رو در نظر بگیرید که در نسخههای قدیمیتر PHP نوشته میشد:
کدنویسی قبل از PHP 8.4:
class Locale
{
private string $languageCode;
private string $countryCode;
public function __construct(string $languageCode, string $countryCode)
{
$this->setLanguageCode($languageCode);
$this->setCountryCode($countryCode);
}
public function getLanguageCode(): string
{
return $this->languageCode;
}
public function setLanguageCode(string $languageCode): void
{
$this->languageCode = $languageCode;
}
public function getCountryCode(): string
{
return $this->countryCode;
}
public function setCountryCode(string $countryCode): void
{
$this->countryCode = strtoupper($countryCode);
}
public function setCombinedCode(string $combinedCode): void
{
[$languageCode, $countryCode] = explode('_', $combinedCode, 2);
$this->setLanguageCode($languageCode);
$this->setCountryCode($countryCode);
}
public function getCombinedCode(): string
{
return \sprintf("%s_%s", $this->languageCode, $this->countryCode);
}
}
$brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->getCountryCode()); // BR
var_dump($brazilianPortuguese->getCombinedCode()); // pt_BR
همونطور که میبینید، کلی تابع get
و set
برای هر متغیر نوشته شده.
حالا ببینید با PHP 8.4 و هوکهای پراپرتی چقدر کد سادهتر میشه:
کدنویسی با PHP 8.4:
class Locale
{
public string $languageCode;
public string $countryCode
{
set (string $countryCode) {
$this->countryCode = strtoupper($countryCode);
}
}
public string $combinedCode
{
get => \sprintf("%s_%s", $this->languageCode, $this->countryCode);
set (string $value) {
[$this->languageCode, $this->countryCode] = explode('_', $value, 2);
}
}
public function __construct(string $languageCode, string $countryCode)
{
$this->languageCode = $languageCode;
$this->countryCode = $countryCode;
}
}
$brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->countryCode); // BR
var_dump($brazilianPortuguese->combinedCode); // pt_BR
این ویژگی باعث میشه کد شما خواناتر بشه و ابزارهای تحلیل کد هم بهتر بفهمن که هر متغیر چطور کار میکنه. نکته جالب دیگه اینه که هوکهای پراپرتی رو حتی میشه توی اینترفیسها (Interfaces) هم تعریف کرد که برای برنامهنویسها یک امکان خیلی کاربردیه. این ویژگی از زبانهایی مثل کاتلین، سیشارپ و سویفت الهام گرفته شده.
دید نامتقارن (Asymmetric Visibility): کنترل دقیقتر روی دسترسی
این هم یکی دیگه از ویژگیهای مهم PHP 8.4 هست. تا قبل از این، وقتی شما یک متغیر توی یک کلاس تعریف میکردید، سطح دسترسی اون (مثلا public, protected, private) برای خوندن و نوشتن یکی بود. یعنی اگه یک متغیر public
بود، هر کسی از بیرون کلاس میتونست هم اون رو بخونه و هم مقدارش رو تغییر بده.
خیلی وقتها برنامهنویسها میخوان یک متغیر از بیرون قابل خوندن باشه، اما فقط از داخل خود کلاس بشه اون رو تغییر داد. برای این کار مجبور بودن متغیر رو private
کنن و بعد یک تابع public
برای خوندنش بنویسن (همون Getter که بالاتر گفتیم). این کار باعث تولید کدهای اضافه میشد.
حالا با «دید نامتقارن»، شما میتونید سطح دسترسی برای خوندن و نوشتن رو جداگانه تعیین کنید.
برای مثال، یک کلاس رو در نظر بگیرید که نسخه PHP رو نگه میداره. قبل از نسخه ۸.۴ کدش این شکلی بود:
کدنویسی قبل از PHP 8.4:
class PhpVersion
{
private string $version = '8.3';
public function getVersion(): string
{
return $this->version;
}
public function increment(): void
{
[$major, $minor] = explode('.', $this->version);
$minor++;
$this->version = "{$major}.{$minor}";
}
}
اینجا متغیر version
خصوصی (private) هست و برای خوندنش باید از تابع getVersion
استفاده کرد.
حالا با PHP 8.4 ببینید چطور میشه:
کدنویسی با PHP 8.4:
class PhpVersion
{
public private(set) string $version = '8.4';
public function increment(): void
{
[$major, $minor] = explode('.', $this->version);
$minor++;
$this->version = "{$major}.{$minor}";
}
}
اینجا با public private(set)
داریم میگیم که این متغیر برای خوندن public
(عمومی) هست، اما برای نوشتن (set) فقط private
(خصوصی) هست. یعنی از بیرون میشه مقدارش رو خوند، ولی نمیشه تغییرش داد. حتی یک حالت خلاصهتر هم وجود داره: private(set)
که همین معنی رو میده. این سینتکس برای protected
هم کار میکنه و با پراپرتیهای پروموت شده (promoted properties) هم سازگاره.
فراخوانی متد بعد از new بدون پرانتز اضافه
این یک تغییر کوچیک اما خیلی کاربردیه که برنامهنویسها مدتها منتظرش بودن. فرض کنید میخواین یک شی (Object) جدید از یک کلاس بسازید و بلافاصله یکی از متدهای اون رو فراخوانی کنید. تا قبل از PHP 8.4، باید کل عبارت new MyClass()
رو داخل یک جفت پرانتز میذاشتید.
قبل از PHP 8.4:
$name = (new ReflectionClass($objectOrClass))->getShortName();
این پرانتزهای اضافه شاید به نظر چیز مهمی نیان، ولی توی کدنویسی روزمره میتونن اذیتکننده باشن.
توی PHP 8.4، دیگه نیازی به این پرانتزها نیست.
با PHP 8.4:
$name = new ReflectionClass($objectOrClass)->getShortName();
این تغییر باعث میشه کد تمیزتر و شبیهتر به زبانهای برنامهنویسی دیگهای مثل جاوا و سیشارپ بشه. این قابلیت نه تنها برای متدها، بلکه برای دسترسی به پراپرتیها و ثابتهای کلاس هم کار میکنه.
اتربیوت #[Deprecated]: راهی استاندارد برای منسوخ کردن کد
کلمه «Deprecated» یعنی «منسوخ شده». توی برنامهنویسی، گاهی وقتها یک تابع یا متد قدیمی میشه و یک راه بهتر برای انجام همون کار به وجود میاد. برنامهنویسها دوست دارن به بقیه بگن که «از این روش قدیمی استفاده نکنید، چون قراره در آینده حذف بشه».
تا قبل از این، راه استاندارد این بود که بالای تابع یک کامنت مخصوص مثل /** @deprecated */
میذاشتن. این کامنتها رو فقط ابزارهای خارجی مثل IDEها میفهمیدن و خود PHP کاری باهاشون نداشت.
حالا توی PHP 8.4، یک اتربیوت (Attribute) داخلی به اسم #[Deprecated]
اضافه شده. وقتی شما این اتربیوت رو بالای یک تابع، متد یا ثابت کلاس میذارید، خود PHP متوجه میشه که اون کد منسوخ شده. اگه کسی از اون کد استفاده کنه، PHP یک اخطار (warning) نشون میده.
قبل از PHP 8.4:
class PhpVersion
{
/**
* @deprecated 8.3 use PhpVersion::getVersion() instead
*/
public function getPhpVersion(): string
{
return $this->getVersion();
}
public function getVersion(): string
{
return '8.3';
}
}
$phpVersion = new PhpVersion();
// هیچ هشداری داده نمیشه
echo $phpVersion->getPhpVersion();
با PHP 8.4:
class PhpVersion
{
#[\Deprecated(
message: "use PhpVersion::getVersion() instead",
since: "8.4",
)]
public function getPhpVersion(): string
{
return $this->getVersion();
}
public function getVersion(): string
{
return '8.4';
}
}
$phpVersion = new PhpVersion();
// این خط یک هشدار تولید میکنه
// Deprecated: Method PhpVersion::getPhpVersion() is deprecated since 8.4, use PhpVersion::getVersion() instead
echo $phpVersion->getPhpVersion();
این اتربیوت میتونه اطلاعات بیشتری مثل دلیل منسوخ شدن و نسخهای که از اون به بعد منسوخ شده رو هم شامل بشه. این کار به خصوص برای فریمورکها و پکیجها خیلی مفیده تا بتونن به کاربرانشون اطلاعرسانی کنن.
پشتیبانی از HTML5 و API جدید برای DOM
DOM یا Document Object Model راهی برای کار با اسناد HTML و XML در برنامهنویسیه. API قبلی DOM در PHP قدیمی بود و با استانداردهای جدید، به خصوص HTML5، مشکلاتی داشت.
در PHP 8.4، یک API کاملا جدید برای DOM در فضای نام (namespace) جدید Dom
معرفی شده. این API جدید با استانداردهای وب مدرن سازگاره و میتونه اسناد HTML5 رو به درستی تجزیه (parse) کنه. همچنین خیلی از باگهای قدیمی API قبلی رو رفع کرده و توابع جدیدی برای کار راحتتر با اسناد بهش اضافه شده.
برای مثال، کد زیر رو ببینید که چطور با API قدیمی کار میکرد:
قبل از PHP 8.4:
$dom = new DOMDocument();
$dom->loadHTML(
<<<'HTML'
<main>
<article>PHP 8.4 is a feature-rich release!</article>
<article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
</main>
HTML,
LIBXML_NOERROR,
);
$xpath = new DOMXPath($dom);
$node = $xpath->query(".//main/article[not(following-sibling::*)]")[0];
$classes = explode(" ", $node->className); // Simplified
var_dump(in_array("featured", $classes)); // bool(true)
حالا با API جدید در PHP 8.4، کار خیلی سادهتره:
$dom = Dom\HTMLDocument::createFromString(
<<<'HTML'
<main>
<article>PHP 8.4 is a feature-rich release!</article>
<article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
</main>
HTML,
LIBXML_NOERROR,
);
$node = $dom->querySelector('main > article:last-child');
var_dump($node->classList->contains("featured")); // bool(true)
برای حفظ سازگاری با کدهای قدیمی، کلاس DOMDocument
قبلی همچنان موجوده. کلاس جدید Dom\HTMLDocument
نام داره.
API شیگرا برای BCMath
BCMath یک افزونه در PHP برای کار با اعداد با دقت خیلی بالاست (arbitrary precision numbers)، مثلا برای محاسبات ریاضی روی اعداد خیلی بزرگ یا خیلی اعشاری که دقتشون مهمه. تا قبل از این، کار با BCMath فقط از طریق توابع ممکن بود.
در PHP 8.4، یک API شیگرا (Object-Oriented) به BCMath اضافه شده. حالا یک کلاس جدید به اسم BcMath\Number
وجود داره که میتونید ازش استفاده کنید. جالبتر اینکه این اشیا از عملگرهای ریاضی استاندارد (مثل +، -، *، /) پشتیبانی میکنن.
قبل از PHP 8.4:
$num1 = '0.12345';
$num2 = '2';
$result = bcadd($num1, $num2, 5);
echo $result; // '2.12345'
var_dump(bccomp($num1, $num2) > 0); // false
با PHP 8.4:
use BcMath\Number;
$num1 = new Number('0.12345');
$num2 = new Number('2');
$result = $num1 + $num2;
echo $result; // '2.12345'
var_dump($num1 > $num2); // false
این اشیا غیرقابل تغییر (immutable) هستن و میشه اونها رو مثل یک رشته چاپ کرد.
توابع جدید برای آرایهها
چند تا تابع جدید و کاربردی برای کار با آرایهها (لیستها) اضافه شده که خیلیها منتظرشون بودن. این توابع به شما کمک میکنن بدون نوشتن حلقههای تکراری (loops)، کارهای رایجی رو انجام بدید.
array_find()
: اولین عنصری از آرایه رو پیدا میکنه که شرط شما رو برآورده کنه.array_find_key()
: کلید (key) اولین عنصری رو پیدا میکنه که شرط شما رو برآورده کنه.array_any()
: چک میکنه که آیا حداقل یک عنصر در آرایه شرط شما رو برآورده میکنه یا نه. (نتیجهtrue
یاfalse
میده)array_all()
: چک میکنه که آیا تمام عناصر آرایه شرط شما رو برآورده میکنن یا نه. (نتیجهtrue
یاfalse
میده)
مثلا برای array_find
، قبلا باید اینجوری کد مینوشتید:
قبل از PHP 8.4:
$animal = null;
foreach (['dog', 'cat', 'cow', 'duck', 'goose'] as $value) {
if (str_starts_with($value, 'c')) {
$animal = $value;
break;
}
}
var_dump($animal); // string(3) "cat"
با PHP 8.4:
$animal = array_find(
['dog', 'cat', 'cow', 'duck', 'goose'],
static fn (string $value): bool => str_starts_with($value, 'c'),
);
var_dump($animal); // string(3) "cat"
این توابع کد رو خیلی خواناتر و کوتاهتر میکنن.
زیرکلاسهای مخصوص درایور برای PDO
PDO یک راه استاندارد برای اتصال به انواع مختلف دیتابیسها در PHP هست. قبلا وقتی شما یک اتصال PDO مثلا به دیتابیس SQLite میساختید، یک شی از نوع PDO
دریافت میکردید.
در PHP 8.4، برای هر درایور دیتابیس، یک زیرکلاس (subclass) مخصوص از PDO
ایجاد شده. مثلا اگه به SQLite وصل بشید، یک شی از نوع Pdo\Sqlite
میگیرید. این کار باعث میشه که توابع مخصوص هر دیتابیس (مثلا createFunction
برای SQLite) رو بشه به صورت مستقیم روی شی اتصال فراخوانی کرد و کد شما از نظر نوع (type) امنتر باشه.
لیست زیرکلاسهای جدید:Pdo\Dblib
, Pdo\Firebird
, Pdo\MySql
, Pdo\Odbc
, Pdo\Pgsql
, و Pdo\Sqlite
.
اشیا تنبل (Lazy Objects)
این یک الگوی برنامهنویسیه که به خصوص فریمورکها ازش استفاده میکنن. ایده اینه که یک شی فقط زمانی به طور کامل ساخته و مقداردهی اولیه بشه که واقعا بهش نیاز پیدا کنیم. این کار به بهبود عملکرد و کاهش مصرف حافظه کمک میکنه، به خصوص برای اشیایی که ساختنشون سنگینه. PHP 8.4 حالا به صورت داخلی از این قابلیت پشتیبانی میکنه.
تغییرات JIT
JIT یا Just-In-Time Compiler یک ویژگی برای افزایش سرعت اجرای کدهای PHP هست. در نسخه ۸.۴، یک پیادهسازی جدید از JIT بر اساس IR Framework انجام شده. همچنین نحوه فعال کردن JIT در فایل تنظیمات php.ini
تغییر کرده. قبلا برای غیرفعال کردن JIT باید opcache.jit_buffer_size
رو روی صفر تنظیم میکردید، اما الان باید opcache.jit=disable
رو تنظیم کنید. این تغییر میتونه روی کاربرانی که jit_buffer_size
رو مشخص کردن ولی opcache.jit
رو نه، تاثیر بذاره. اونها باید opcache.jit=tracing
رو اضافه کنن تا JIT دوباره فعال بشه.
تغییر رفتار exit() و die()
در PHP، exit
و die
(که یک نام مستعار برای exit
هست) همیشه موجودات عجیبی بودن. میشد اونها رو هم مثل یک کلمه کلیدی (exit;
) و هم مثل یک تابع (exit(0);
) استفاده کرد. اما وقتی مثل تابع استفاده میشدن، واقعا یک تابع کامل نبودن. مثلا از آرگومانهای نامگذاری شده پشتیبانی نمیکردن یا نمیشد اونها رو به عنوان یک callable
پاس داد.
در PHP 8.4، این رفتار اصلاح شده و exit()
و die()
حالا به عنوان توابع واقعی در نظر گرفته میشن. البته حالت بدون پرانتز همچنان مثل قبل کار میکنه.
لیست سایر توابع و کلاسهای جدید
علاوه بر موارد بالا، کلی تابع و متد جدید دیگه هم اضافه شده که اینجا به صورت لیست بهشون اشاره میکنیم:
- توابع BCMath جدید:
bcceil()
,bcdivmod()
,bcfloor()
, وbcround()
برای گرد کردن و تقسیم اعداد با دقت بالا. - حالتهای گرد کردن جدید: یک enum جدید به اسم
RoundingMode
برای تابعround()
با ۴ حالت جدید اضافه شده. - متدهای جدید DateTime: متدهای
createFromTimestamp()
,getMicrosecond()
, وsetMicrosecond()
به کلاسهایDateTime
وDateTimeImmutable
اضافه شدن. - توابع جدید mbstring: توابع
mb_trim()
,mb_ltrim()
,mb_rtrim()
,mb_ucfirst()
, وmb_lcfirst()
برای کار با رشتههای چندبایتی (مثل فارسی). - توابع جدید PCNTL: توابع
pcntl_getcpu()
,pcntl_setns()
و … برای کنترل پراسسها در سطح سیستم عامل. - متدهای جدید Reflection: متدهای جدیدی مثل
isDeprecated()
,isClosed()
,isDynamic()
به کلاسهای Reflection اضافه شدن. - توابع و متدهای جدید دیگر: مثل
request_parse_body()
,http_get_last_response_headers()
, متدهای جدید برایXMLReader
وXMLWriter
و تابعgrapheme_str_split()
. - پشتیبانی از
AEGIS-128L
وAEGIS256
در Sodium برای رمزنگاری. - ثابتهای جدید در Curl برای HTTP/3:
CURL_HTTP_VERSION_3
وCURL_HTTP_VERSION_3ONLY
. - گزینههای جدید در Curl: مثل
CURLOPT_PREREQFUNCTION
,CURLOPT_DEBUGFUNCTION
و …
موارد منسوخ شده و تغییراتی که سازگاری را میشکنند
هر نسخه جدیدی از PHP علاوه بر ویژگیهای جدید، یک سری از ویژگیهای قدیمی رو هم منسوخ (deprecate) یا حذف میکنه. این کار برای تمیز نگه داشتن زبان و بهبود امنیت و عملکرد لازمه.
منظور از «منسوخ شده» چیه؟ یعنی اینکه یک ویژگی هنوز کار میکنه، اما استفاده از اون توصیه نمیشه و در نسخههای آینده (مثلا PHP 9) به طور کامل حذف خواهد شد. PHP با نشون دادن یک هشدار به شما اطلاع میده که از این ویژگی استفاده نکنید.
لیست مهمترین تغییرات این بخش:
- جدا شدن چند افزونه از هسته: افزونههای IMAP, OCI8, PDO_OCI, و pspell دیگه به صورت پیشفرض با PHP نصب نمیشن. اگه به اونها نیاز دارید، باید از طریق PECL به صورت جداگانه نصبشون کنید.
- منسوخ شدن پارامترهای Nullable ضمنی: قبلا اگه برای یک پارامتر تایپشده، مقدار پیشفرض
null
میذاشتید، PHP به طور خودکار اون رو nullable (قابل تهی بودن) در نظر میگرفت. این رفتار گیجکننده بود. از این به بعد این کار منسوخ شده و باید به صراحت از علامت سوال?
برای nullable کردن استفاده کنید.- مثال:
function save(Book $book = null)
منسوخ شده و باید بهfunction save(?Book $book = null)
تغییر پیدا کنه.
- مثال:
- استفاده از
_
به عنوان نام کلاس منسوخ شده. - ثابت
E_STRICT
منسوخ شده و سطح خطای مربوط به اون حذف شده. - تغییرات در
round()
: پاس دادن یک حالت (mode) نامعتبر به تابعround()
از این به بعد یک خطایValueError
ایجاد میکنه. - تایپدار شدن ثابتهای کلاس: ثابتهای کلاس در افزونههای مهمی مثل
date
,intl
,pdo
, وreflection
حالا تایپ مشخص دارن. - کلاس GMP نهایی (final) شده و دیگه نمیشه ازش ارثبری کرد.
- حذف برخی ثابتها در
mysqli
و منسوخ شدن توابعmysqli_ping()
,mysqli_kill()
,mysqli_refresh()
. - تغییر هزینه پیشفرض Bcrypt در هش کردن پسورد: این هزینه از
10
به12
افزایش پیدا کرده که باعث امنتر شدن هشهای پسورد میشه. - افزایش حداقل نسخه مورد نیاز: برای افزونه OpenSSL حداقل نسخه ۱.۱.۱ و برای libcurl حداقل نسخه ۷.۶۱.۰ نیازه.
PHP 8.4 و سازگاری با وردپرس و سایر سیستمها
خب، حالا که با ویژگیهای جدید و تغییرات PHP 8.4 آشنا شدیم، سوال مهم اینه که آیا میشه ازش با سیستمهای محبوبی مثل وردپرس استفاده کرد یا نه؟
جواب کوتاه اینه: باید با احتیاط عمل کرد.
وقتی یک نسخه جدید PHP منتشر میشه، مدتی طول میکشه تا تمام سیستمها، فریمورکها، پلاگینها و تمها خودشون رو باهاش سازگار کنن. استفاده از یک نسخه PHP که توسط CMS یا پلاگینهای شما پشتیبانی نمیشه، میتونه باعث خطاهای جدی، از کار افتادن سایت یا رفتارهای غیرمنتظره بشه.
وضعیت سازگاری وردپرس
بر اساس اطلاعات موجود، وضعیت وردپرس با PHP 8.4 به این شکله:
- وردپرس ۶.۷ فقط پشتیبانی بتا (beta support) از PHP 8.4 داره. این یعنی تیم وردپرس در حال کار روی سازگاری کامل هستن، اما هنوز برای استفاده در سایتهای واقعی (production) توصیه نمیشه.
- شرکتهای هاستینگ مثل Kinsta این نسخه رو برای مشتریانشون فراهم کردن، اما خودشون هم تاکید میکنن که نسخه پیشنهادی برای اکثر سایتهای وردپرسی در حال حاضر PHP 8.2 هست.
- توصیه اکید اینه که قبل از آپدیت، حتما یک بکاپ کامل از سایتتون بگیرید و اول تغییرات رو روی یک محیط آزمایشی (staging) تست کنید. اگه همه چیز بدون خطا کار کرد، اون وقت میتونید سایت اصلی رو آپدیت کنید.
- تیم توسعهدهنده وردپرس هم در حال اعمال تغییراتی در هسته وردپرس برای سازگاری با PHP 8.4 هستن. برای مثال، اونها به خاطر منسوخ شدن
trigger_error()
باE_USER_ERROR
در PHP 8.4، تابعwp_trigger_error()
رو تغییر دادن و یک کلاس جدید به اسمWP_Exception
معرفی کردن. این نشون میده که کار برای سازگاری کامل در جریانه.
وضعیت سازگاری سایر سیستمها
بیایید نگاهی به جدول سازگاری که توسط سایت maxcluster.de و بقیه منابع تهیه شده بندازیم:
سیستم / CMS | سازگاری با PHP 8.4 | توضیحات |
---|---|---|
Shopware 6 | ❌ | طبق مستندات رسمی، هنوز پشتیبانی تایید شدهای وجود نداره. |
TYPO3 | ✅ | از نسخههای ۱۲ و ۱۳ به بعد سازگار هست. |
WordPress / WooCommerce | ⚠️ | پشتیبانی بتا در وردپرس ۶.۷. برای استفاده در محیط واقعی توصیه نمیشه. |
Drupal | ✅ | فقط نسخههای ۱۰.۴ و ۱۱.۱ سازگار هستن. |
OroCommerce | ❌ | مستندات فقط پشتیبانی تا PHP 8.3 رو ذکر کردن. |
Matomo (Piwik) | ✅ | از نسخه ۵.۲.۰ به بعد سازگاره. |
Tideways | ✅ | کاملا با PHP 8.4 سازگاره. |
بحثها و نظرات در جوامع برنامهنویسی
نگاهی به صحبتهای کاربران و توسعهدهندگان در پلتفرمهایی مثل Reddit، Plesk و Nextcloud هم جالبه:
- جامعه لاراول (Reddit): یک کاربر در r/laravel میگه که در شرکتشون معمولا یک نسخه اصلی عقبتر از آخرین نسخه PHP باقی میمونن. دلیلش اینه که نمیخوان با «papercuts» یا مشکلات ریز و درشتی که ممکنه در ابتدای انتشار یک نسخه جدید برای پکیجهای مختلف پیش بیاد، درگیر بشن. این یک دیدگاه رایج در بین خیلی از توسعهدهندههاست.
- انجمن Plesk: کاربرها در انجمن Plesk در مورد زمان ارائه PHP 8.4 سوال کرده بودن. توسعهدهندههای Plesk توضیح دادن که آمادهسازی و تست یک نسخه جدید PHP برای بیش از ۱۰ سیستمعامل مختلف، فرآیند پیچیده و زمانبریه. اونها باید مطمئن بشن که همه چیز پایدار و سازگار کار میکنه. جالبه که یکی از کاربران اشاره کرده بود که cPanel (که متعلق به همون شرکت مادر Plesk هست) زودتر PHP 8.4 رو ارائه کرده.
- انجمن Nextcloud: کاربران Nextcloud هم سوال مشابهی داشتن. به اونها گفته شده که پشتیبانی از نسخههای جدید PHP معمولا با انتشار نسخههای اصلی (major release) جدید Nextcloud اضافه میشه. مثلا برای پشتیبانی از PHP 8.4 باید منتظر Nextcloud 31 باشن که حدود ۳۵ روز بعد از اون تاریخ منتشر میشد.
این بحثها نشون میده که فرایند آپدیت به یک نسخه جدید PHP در دنیای واقعی چطور پیش میره. اینطور نیست که به محض انتشار، همه بتونن فورا ازش استفاده کنن. صبر و تست کردن، کلید یک انتقال موفق و بدون دردسره.
چطور به PHP 8.4 مهاجرت کنیم؟
اگه تصمیم گرفتید که از PHP 8.4 استفاده کنید، این مراحل رو دنبال کنید:
- بررسی سازگاری: اولین و مهمترین قدم. مطمئن بشید که CMS، فریمورک، تمها و تمام پلاگینهای شما با PHP 8.4 سازگار هستن. مستندات رسمی اونها رو چک کنید.
- تهیه بکاپ: یک نسخه پشتیبان کامل از فایلها و دیتابیس سایتتون تهیه کنید. این کار مثل بیمه عمر برای سایت شماست.
- استفاده از محیط آزمایشی (Staging): اکثر هاستینگهای خوب مثل Kinsta، یک محیط staging در اختیار شما قرار میدن. سایتتون رو به اونجا کپی کنید و نسخه PHP رو به ۸.۴ تغییر بدید. همه جای سایت رو با دقت تست کنید.
- بررسی کد: اگه خودتون برنامهنویس هستید، کدهاتون رو برای استفاده از ویژگیهای منسوخ شده بررسی کنید و اونها رو با روشهای جدید جایگزین کنید.
- آپدیت نهایی: بعد از اینکه مطمئن شدید همه چیز در محیط آزمایشی درست کار میکنه، میتونید نسخه PHP سایت اصلیتون رو آپدیت کنید. در هاستینگهایی مثل Kinsta یا maxcluster، این کار معمولا با چند کلیک ساده از طریق پنل کاربری انجام میشه.
در نهایت، شرکتهای هاستینگ مثل maxcluster اعلام کردن که از تاریخ ۱۴ ژانویه ۲۰۲۵، کاربرانشون روی تمام کلاسترهای اوبونتو میتونن به راحتی PHP 8.4 رو از طریق پنل کاربری فعال کنن. این انعطافپذیری در انتخاب نسخه PHP یک مزیت بزرگ محسوب میشه.
منابع
- PHP: PHP 8.4 Release Announcement
- PHP 8.4: What’s New and Changed • PHP.Watch
- What’s new in PHP 8.4 – stitcher.io
- PHP 8.4 is released with Property Hooks, Class Instantiation without extra parenthesis, and more – Laravel News
- PHP 8.4 Compatibility : r/laravel
- Question – PHP 8.4 ETA ? | Plesk Forum
- When nextcloud will support PHP 8.4? – ℹ️ Support – Nextcloud community
- PHP 8.4 is now available for Kinsta’s WordPress customers
- Getting ready for PHP 8.4: some code changes landing in 6.7 – Make WordPress Core
- PHP 8.4 – Is the update worth it? | maxcluster
- PHP 8.4 and WordPress Compatibility: What Agencies Need to Know – InstaWP
دیدگاهتان را بنویسید