خانه توسعهدهنده ویژگی های جدید PHP 8.3 که باید بشناسید – نگاهی کامل به تغییرات PHP 8.3
ویژگی های جدید PHP 8.3 که باید بشناسید – نگاهی کامل به تغییرات PHP 8.3
هر زمان که نسخهای جدید از زبان برنامهنویسی PHP از راه میرسد، ابزارهایی هرچه بیشتر در دسترس توسعهدهندگان قرار میگیرد تا فرایندهای خود را سرراستتر پیش ببرند، کدهایی باکیفیتتر بنویسند و پرفورمنس اپلیکیشنهای خود را بهبود ببخشند. PHP 8.3 نیز از این قاعده مستثنی نبوده و تغییراتی را با خود به همراه آورده که قطعا کمک قابل توجهی به برنامهنویسان میکنند. با کوئرا بلاگ همراه باشید تا نگاهی به تمام تغییرات و ویژگی های جدید PHP 8.3 بیندازیم و ببینیم چگونه شرایط را برای پشت سر گذاشتن آموزش PHP و همینطور توسعه پروژههای مختلف بهبود میدهند.
ویژگی های جدید PHP 8.3
برای اینکه آشنایی با تمام موارد جدید در PHP 8.3 آسان شود، مقاله به دو بخش تقسیم شده است. در این بخش ابتدایی با ویژگیهای جدید آشنا میشویم و در بخش بعدی به سراغ موارد منسوخ شده یا به اصطلاح Deprecated و همینطور تازهترین تغییرات PHP 8.3 میرویم.
نوعدهی متغیرهای کلاس برای بهبود یکپارچگی کد
در PHP 8.3 شاهد قابلیتی قدرتمند به نام «نوعدهی متغیرهای کلاس» (Typed Class Constants) داریم که با نوعدهی سختگیرانه برای هر متغیر کلاس، کد را اتکاپذیرتر میکند. به مثال زیر توجه کنید:
class PaymentMethods {
const CREDIT_CARD: string = 'credit_card';
const PAYPAL: string = 'paypal';
const BANK_TRANSFER: string = 'bank_transfer';
}
اعتبارسنجی JSON با تابع جدید ()json_validate
تابع ()json_validate یکی از جدیدترین ویژگی های PHP 8.3 برای افزونه JSON است. به کمک این تابع میتوانید رشته یا استرینگهای JSON را در برابر اسکیماهای از پیشتعریفشده، اعتبارسنجی کنید و از دقت و یکپارچگی داده مطمئن شوید. این تابع قرار است فرایند اعتبارسنجی را سرراست کند، از پیچیدگیهای آن بکاهد و از بروز خطاهای بالقوه هنگام کار با روتینهای اعتبارسنجی سفارشی جلوگیری به عمل آورد.
$jsonData = '{"name": "John", "age": 30, "email": "john@example.com"}';
$jsonSchema = '{"type": "object", "properties": {"name": {"type": "string"},
"age": {"type": "integer"}, "email": {"type": "string", "format": "email"}}}';
if (json_validate($jsonData, $jsonSchema)) {
echo "JSON data is valid!";
} else {
echo "JSON data is invalid.";
}
متغیرهای کلاس پویا و پشتیبانی از Enum Member Fetch
تا پیش از نسخه 8.3، متغیرهای کلاس (Class Constants) با مقادیری ثابت تعریف میشدند که امکان محاسبه آنها هنگام رانتایم (Runtime) وجود ندارد. در PHP 8.3 شاهد «متغیرهای کلاس پویا» (Dynamic Class Constants) هستیم که به توسعهدهندگان اجازه میدهد بسته به اکسپرشنها، مقادیری مختلف را به متغیرهای کلاس تخصیص دهند. این ویژگی جدید باعث میشود شاهد کاربرد و تطبیقپذیری بیشتر متغیرهای کلاس باشیم.
enum Status: string {
case PENDING = 'pending';
case APPROVED = 'approved';
case REJECTED = 'rejected';
}
$status = Status::fetch('approved');
echo $status; // Output: "approved"
بهبود بازیافت حافظه با تابع ()gc_status
تابع ()gc_status قابلیت جدیدی در مکانیزم «بازیافت حافظه» یا «زبالهروبی» (Garbage Collection) به حساب میآید. این تابع جزییاتی فراوان راجع به وضعیت بازیافت حافظه در اختیارتان میگذارد، از جمله آمار مربوط به بازیافت، مصرف حافظه و سیکلهای زبالهروبی. چنین اطلاعات ارزشمندی باعث میشود برنامهنویسان به دانش لازم برای بهینهسازی مدیریت حافظه دسترسی داشته باشند.
$gcStatus = gc_status();
echo "Total collected cycles: " . $gcStatus['cycles'];
echo "Memory usage before collection: " . $gcStatus['memoryUsageBefore'];
echo "Memory usage after collection: " . $gcStatus['memoryUsageAfter'];
متد جدید Random\Randomizer::getBytesFromString\
متد Random\Randomizer::getBytesFromString\ قابلیتی جدید برای افزونه Random است که به برنامهنویسان اجازه میدهد بایتهای تصادفی و امن را از هر رشتهای استخراج کنند و رویکردی انعطافپذیرتر در تولید داده تصادفی در پیش بگیرند.
use \Random\Randomizer;
$seed = "mySecretSeed";
$randomBytes = Randomizer::getBytesFromString($seed, 32);
// $randomBytes now contains 32 secure random bytes derived from the seed
متدهای جدید ()Random\Randomizer::getFloat\ و ()nextFloat
از دیگر ویژگی های PHP 8.3 و افزونه Random میشود به متد ()Random\Randomizer::getFloat\ و همتای آن، ()nextFloat اشاره کرد. این متدها به برنامهنویسان اجازه میدهند اعداد ممیز شناور (Floating-Point Numbers) تصادفی را به صورت دقیق از بازههای مشخص استخراج کنند و دقت داده تصادفی را بهبود دهند.
هنگام استفاده از ()Random\Randomizer::getFloat\ باید مقدار کمینه و بیشینه را تعریف کنید و سپس اعداد ممیز شناور تصادفی تولید میشوند.
use \Random\Randomizer;
$min = 0.0;
$max = 1.0;
$randomFloat = Randomizer::getFloat($min, $max);
پشتیبانی از مقدار Fallback در سینتکس PHP INI Environment Variable
سینتکس PHP INI Environment Variable بهگونهای بهبود یافته که حالا از «مقادیر بازگشتی» (Fallback Values) پشتیبانی میکند. این یعنی برنامهنویسان میتوانند مقداری پیشفرض را برای یک متغیر محیطی (Environment Variable) تعریف و اطمینان حاصل کنند که اگر متغیر محیطی مشخصی هم تعیین نشد، اپلیکیشن به کارکرد صحیح خود ادامه دهد.
با استفاده از این سینتکس، میتوان یک مقدار بازگشتی برای متغیر محیطی تعریف کرد:
$_ENV[‘VARIABLE_NAME’] = $_ENV[‘VARIABLE_NAME’] ?? ‘fallback_value’;
این سینتکس بررسی میکند که آیا متغیر محیطی از پیش تنظیم شده است یا خیر. اگر نه، به سراغ مقدار بازگشتی تعیینشده میرود.
$_ENV['DATABASE_HOST'] = $_ENV['DATABASE_HOST'] ?? 'localhost';
پشتیبانی PHP CLI از لینت پیدرپی فایلها
یکی دیگر از ویژگی های جدید PHP 8.3 این است که «رابط خط فرمان» یا همان «CLI» حالا میتواند با یک فرمان، فرایند لینت (Lint) کردن چندین فایل را پیش ببرد. این بهبود بزرگ به برنامهنویسان اجازه میدهد سینتکس فایلهای گوناگون را به شکلی بهینه و سریع اعتبارسنجی کنند.
برای کمک به این فرایند، برنامهنویس میتواند فهرستی از مسیرهای فایلها تهیه کنید. سپس CLI به صورت متوالی هر فایل را بررسی میکند و در صدد شناسایی خطاهای سینتکس و ارائه بازخورد دقیق برمیآید.
php -l file1.php file2.php file3.php
پشتیبانی تابع ()class_alias از نامگذاری موقت کلاسهای داخلی PHP
در PHP 8.3، تابع ()class_alias از قابلیت تعیین نام موقت (Alias) برای کلاسهای داخلی PHP برخوردار شده که پیشتر امکانپذیر نبود. این بهبود به ظاهر کوچک به توسعهدهندگان اجازه میدهد نامهایی سفارشی برای کلاسهای استاندارد PHP تعیین کنند و در نتیجه، خوانایی و نگهداشتپذیری کد را بالا ببرند.
برای استفاده از تابع ()class_alias و نامگذاری کلاسها، باید نام مورد نظرتان را مشخص کنید و نام اصلی کلاس را به عنوان آرگومان بیاورید.
class_alias(\DateTime::class, 'MyDateTime');
$customDateTime = new MyDateTime();
تابع جدید ()stream_context_set_options
در PHP 8.3، تابع ()stream_context_set_options تبدیل به ابزاری قدرتمند برای دستکاری جریان کانتکسها (Contexts) شده است. با این تابع میتوانید گزینههای کانتکست را به شکلی پویا تغییر و اجازه دهید کانتکستها، همانطور که نیاز دارید با جریان عملیاتها تطبیق یابند.
$context = stream_context_create([
'http' => [
'method' => 'POST',
'header' => 'Content-type: application/json',
'content' => json_encode(['key' => 'value']),
],
]);
stream_context_set_options($context, [
'http' => ['timeout' => 10],
]);
موارد منسوخ شده و تغییرات PHP 8.3
در بخش بعدی مقاله، به سراغ مواردی که حالا منسوخ شدهاند و همینطور مهمترین تغییرات PHP 8.3 میرویم.
تغییرات ()get_class و ()get_parent_class
در PHP 8.3، فراخوانی توابع ()get_parent_class و ()get_class بدون پارامترها، رویکردی منسوخ به حساب میآید. در PHP 9.0 نیز دیگر خبری از چندین ورژن مختلف از یک تابع با پارامترهای گوناگون نخواهد بود. این یعنی اگر پارامتر object$ را تعریف نکنید، با خطای «ArgumentCountError» مواجه خواهید شد.
class Test {
public function __construct() {
echo get_class($this);
}
}
خطای E_WARNING در تابع ()unserialize
پیش از اینکه PHP 8.3 از راه برسد، اگر رشتهای نامعتبر را در اختیار تابع ()unserialize میگذاشتید، گاهی از اوقات با خطای E_NOTICE روبهرو میشدید، درست مثل زمانی که خطای سینتکس در رشته وجود دارد.
در PHP 8.3، از پیامهای هشداری به نام E_WARNING رونمایی شده که تمیز دادن این موارد را از یکدیگر آسانتر میکند. علاوه بر این، برخی شروط خطا در تابع ()unserialize هم تغییر کردهاند تا پیام هشدار E_WARNING را مقابل چشم کاربر قرار دهند.
سه شرط خطایی که در پایین آوردهایم، پیشتر E_NOTICE را بازمیگرداندند اما از PHP 8.3 به بعد E_WARNING را به نمایش درمیآورند:
- خطاهای سینتکس در رشته قبلی
- خطاهای موجود در هندلرهای سفارشی و بدون سریالی که از متد جادویی unserializeـــ استفاده میکنند: مثلا زمانی که متد ()unserializeـــ هیچ مقداری را باز نمیگرداند.
- بازگردانی دوباره متغیری یکسان در متد جادویی ()sleep__ که منجر به تداخل نامها میشود.
تغییرات HTML خروجی highlight_file و highlight_string
PHP 8.3 تغییراتی در نحوه پردازش فضای خالی از سوی هایلایتر نیز به وجود میآورد و حالا خروجی را میان تگ <pre></pre> قرار میدهد. علاوه بر این، کاراکترهای خط جدید دیگر تبدیل به تگهای <br /> نمیشوند و در نتیجه باید منتظر HTML خروجی هایلایتشده و چند خطی باشید.
جمعبندی
ویژگی های جدید PHP 8.3 شاید آنقدرها انقلابی نباشند که تمام برنامهنویسان را به ارتقا وادارند، اما در مجموع شاهد بهبودهای کوچک و بزرگی هستیم که فرایند توسعه نرمافزار را آسانتر میکنند. اگر تصمیم به کار با PHP 8.3 گرفتید، قویاً توصیه میکنیم که نگاهی به اسناد رسمی PHP بیندازید تا اطلاعاتی کامل راجع به این استاندارد جدید به دست آورید.
+ منبع: Cloudways