Codoloper

بررسی PHP ورژن 8 - چه چیز جدیدی داره

بررسی PHP ورژن 8 - چه چیز جدیدی داره | عکس

PHP 8 چه چیز جدیدی دارد؟ سفری به مهم‌ترین تحولات این نسخه

PHP 8 در نوامبر 2020 منتشر شد و بدون شک یکی از بزرگ‌ترین به‌روزرسانی‌های تاریخ این زبان است. این نسخه مملو از ویژگی‌های جدید، بهبود کارایی و تغییرات ساختاری است که کدنویسی را لذت‌بخش‌تر، خوانایی کدها را بیشتر و اجرای برنامه‌ها را سریع‌تر می‌کند.

در ادامه، مهم‌ترین قابلیت‌های PHP 8 را با مثال بررسی می‌کنیم.

۱. کامپایلر JIT (Just-In-Time)

شاید مهم‌ترین تغییر فنی در PHP 8، افزوده شدن کامپایلر JIT باشد. در نسخه‌های پیشین، کد PHP همیشه به بایت‌کد تبدیل و سپس توسط ماشین مجازی Zend اجرا می‌شد. اما در PHP 8، JIT می‌تواند بخش‌هایی از کد را مستقیماً به زبان ماشین ترجمه کند.

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

۲. Attributes (نشانه‌گذاری‌های بومی)

تا پیش از PHP 8، برای افزودن متادیتا به کلاس‌ها و متدها مجبور بودید از DocBlock کامنت‌ها استفاده کنید. اما PHP 8 اتربیوت‌ها را معرفی کرد: یک روش بومی و ساختاریافته برای نشانه‌گذاری کد.

#[Route('/api/users', methods: ['GET'])]
class UserController {
    #[Inject]
    private UserRepository $repository;
}

این ویژگی باعث می‌شود ابزارهایی مانند Doctrine، Symfony و Laravel دیگر نیازی به پردازش کامنت‌ها نداشته باشند و کد تمیزتر و سریع‌تری داشته باشید.

۳. Named Arguments (آرگومان‌های نام‌دار)

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

function createUser($name, $email, $role = 'user', $isActive = true) {
    // ...
}

// فراخوانی با Named Arguments
createUser(
    name: 'احمد',
    email: 'ahmad@example.com',
    isActive: false
    // نقش همان 'user' باقی می‌ماند
);

این قابلیت به خصوص برای توابع با پارامترهای زیاد یا پیش‌فرض بسیار مفید است.

۴. Constructor Property Promotion

قبل از PHP 8، برای تعریف و مقداردهی پراپرتی‌های کلاس در سازنده، کد زیادی می‌نوشتید. حالا می‌توانید تعریف پراپرتی و مقداردهی آن را یکجا در آرگومان‌های سازنده انجام دهید.

قبلاً:

class User {
    private string $name;
    private int $age;

    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
}

حالا در PHP 8:

class User {
    public function __construct(
        private string $name,
        private int $age
    ) {}
}

کد بسیار کم‌حجم‌تر و خواناتر شده است.

۵. Match Expression (جایگزین بهتری برای Switch)

عبارت match شبیه switch است، اما با تفاوت‌های مهم: نیاز به break ندارد، مقدار بازگشتی دارد و مقایسه از نوع Strict (===) است.

$statusCode = 404;

$message = match($statusCode) {
    200, 201 => 'موفق',
    404 => 'پیدا نشد',
    500 => 'خطای سرور',
    default => 'ناشناخته'
};

echo $message; // پیدا نشد

این روش خواناتر و امن‌تر از switch سنتی است.

۶. Nullsafe Operator

فرض کنید می‌خواهید به یک پراپرتی از یک آبجکت برسید، اما ممکن است خود آبجکت یا واسط‌ها null باشند. در PHP 8 با عملگر ?-> می‌توانید زنجیره‌ای از دسترسی‌ها را بدون نگرانی از خطای Null انجام دهید.

$city = $user?->getAddress()?->city?->getName();

اگر هرکدام از این مراحل null باشد، کل عبارت null برمی‌گرداند و خطایی رخ نمی‌دهد.

۷. انواع ترکیبی (Union Types)

حالا می‌توانید برای یک پارامتر یا خروجی بیش از یک نوع داده را مشخص کنید.

function validate($input): int|float|false {
    // می‌تواند int یا float برگرداند، یا false در صورت خطا
}

این قابلیت امنیت نوع‌ها را به طرز چشمگیری افزایش می‌دهد.

۸. بهبود در توابع داخلی

PHP 8 توابع رشته‌ای جدیدی معرفی کرد که استفاده رایج را ساده‌تر می‌کنند:

  • str_contains(): بررسی وجود زیررشته در رشته
  • str_starts_with() و str_ends_with()
  • get_debug_type(): نمایش نوع واقعی متغیر
if (str_contains('Hello world', 'world')) {
    echo 'پیدا شد';
}

دیگر نیازی به استفاده از strpos() !== false نیست.

۹. Weak Maps

نقشه‌های ضعیف (Weak Maps) به شما اجازه می‌دهند اشیاء را به عنوان کلید در یک آرایه ذخیره کنید، بدون اینکه مانع از پاک شدن آن شیء توسط گاربیج کالکتور شوند. این ویژگی برای پیاده‌سازی کش و سیستم‌های ذخیره‌سازی موقت عالی است.

۱۰. TypeError بهبودیافته

حالا خطاهای نوع در توابع دقیق‌تر و کمک‌کننده‌تر هستند. پیغام خطا نشان می‌دهد دقیقاً چه نوعی انتظار می‌رفته و چه نوعی دریافت شده است.

جمع‌بندی: آیا به PHP 8 بریم؟

پاسخ بله است، اما با رعایت یکسری نکات:

  • برنامه‌های قدیمی ممکن است با تغییرات ناسازگار (مانند حذف برخی توابع) مواجه شوند.
  • اکثر فریمورک‌های محبوب (Laravel، Symfony، WordPress) از PHP 8 پشتیبانی کامل دارند.
  • افزایش سرعت، کدنویسی خواناتر و کاهش خطاهای رایج ارزش ارتقا را دارد.

PHP 8 سنگی محکم در مسیر تکامل این زبان است. اگر هنوز از PHP 7 استفاده می‌کنید، زمان مناسبی است برای مهاجرت به PHP 8 یا حتی PHP 8.1 و 8.2 که بهبودهای بیشتری نیز ارائه داده‌اند.

برامون کامنت بزار