تغییرات جدید PHP 8.4

پی اچ پی 8.4 در 1 آذر سال 1403 (November 21, 2024) منتشر خواهد شد، البته شاید تغییر کند. در این ورژن تغییراتی شاهد خواهیم بود مثل: property hooks - new without additional parentheses و... .

 قابلیت های جدید:

 

Property hooks

یکی از مهم ترین تغییرات جدید پی اچ پی 8.4 این هست که شما قادر هستید بدون نیاز به مجیک فانکشن های __set و __get بتونید پراپرتی های خودتون set و get کنید:

class User
{
    protected bool $isModified = false;

    public function __construct(
        protected string $first,
        protected string $last
    ) {}

    public string $username {
        get => $this->first . " " . $this->last;
        set {
            [$this->first, $this->last] = explode(' ', $value, 2);
            $this->isModified = true;
        }
    }
}

همینطور به احتمال زیاد این قابلیت هم داشته باشیم که بتونیم درون اینترفیس (interface) ها خودمون به set و get اشاره کنیم:

interface HasUsername
{
    public string $username { get; set; }
}

 

new" without parentheses"

ما در ورژن های قبلی پی اچ پی برای ساخت یک آبجکت با استفاده از new می اومدیم از پرانتز استفاده میکردیم:

(new Milwad())->info();

اما در ورژن جدید پی اچ پی ما میتونیم بدون نیاز به پرانتز یک شی بسازیم:

new Milwad()->info();

البته ما میتونیم به متغیر ها، ثابت ها و.. اینجوری دسترسی داشته باشیم:

new Milwad()::NAME, // milad
new Milwad()::$age, // 18
new Milwad()::job(), // developer and founder
new Milwad()->email, // milwad.dev@gmail.com
new Milwad()->info(), // ...
new Milwad()(), // Invoke

 

JIT changes

در ورژن جدید پی اچ پی شما برای غیرفعال کردن JIT نیاز به این بود که بیاید opcache.jit_buffer_size به 0 تغییر دهید اما الان شما کافیه کار پایین انجام بدید:

opcache.jit=disable
opcache.jit_buffer_size=64m

 

Implicit nullable types

پی اچ پی یک رفتار (عجیب) داشت که اینجوری بود که مقدار پیشفرض یک متغیر null میزاشتیم به صورت اتوماتیک یک متغیر null میساخت:

function store(Post $post = null) {}

این رفتار در حال حاضر قرار هست که منسوخ بشه و در پی اچ پی 9 حذف خواهد شد و برای این کار باید به شکل زیر عمل کنید:

function store(?Post $post = null) {}

 

New HTML5 support

در پی اچ پی 8.4 یک کلاس جدید به نام DomHTMLDocument اضافه شده برای اینکه کد های HTML 5 پروسس کنه. کلاس قبلی به نام DOMDocument هنوز هست برای اینکه کد های قدیمی به مشکل نخورند:

$doc = DomHTMLDocument::createFromString($contents);

 

فانکشن های جدید برای سرچ در آرایه

پی اچ پی فانکشن های array_find - array_find_key - array_any - array_all اضافه کرده که خیلی راحت میتونیم در آرایه ها با استفاده از شرط آیتم ها سرج کنیم. اگر با کالکشن های لاراول کار کرده باشید میتونید شباهت رو حس کنید. خب حالا فرض کنید که یک آرایه با آیتم های مختلف مثل شکل زیر داریم:

$array = [
    'Taylor' => 'Creator',
    'Milwad' => 'YouTuber',
    'Dries' => 'Developer',
    'James' => 'Team-Lead',
    'Nuno' => 'Engineer',
    'Laravel' => 'Love'
];

حالا اگه بخوایم بر اساس مقدار آیتم های آرایه سرچ کنیم، میتونیم از فانکشن array_find() استفاده کنیم:

array_find($array, function (string $value) { 
    return str_contains($value, '-');
}); // Team-Lead

اگر بخوایم بر اساس کلید های آرایه سرچ کنیم، میتونیم از فانکشن array_find_key() استفاده کنیم:

array_find_key($array, function (string $value) { 
    return strlen($value) > 5;
}); // Laravel

اگر بخوایم براساس یک شرط آرایه خود تست کنیم، میتونیم از فانکشن array_any() استفاده کنیم، برای مثال میخواید فرض کنید که آیا توی این آرایه مقدار کاراکتر ها بیشتر از 5 هست یا نه:

array_any($array, function (string $value) { 
    return strlen($value) > 5;
}); // bool(true)

خب فانکشن بالا چک میکنه اگه یه آیتم با شرط مطابقت داره مقدار true برمیگردونه اما فانکشن array_all() میاد تمام آیتم های آرایه با شرط چک میکنه و باید تمام آیتم ها با شرط مطابقت داشته باشند:

array_all($array, function (string $value) { 
    return strlen($value) > 5;
}); // bool(false)

 

متد جدید "createFromTimestamp" در کلاس DateTimeImmutable

در پی اچ پی 8.4 شما قابلیت ساخت تاریخ از روی timestamp با استفاده از متد جدید کلاس DateTimeImmutable دارید:

$dt = DateTimeImmutable::createFromTimestamp(1718641845);$dt->format('Y-m-d'); // 2024-06-17

البته متد های شبیه هم وجود داشته از قبل:

$dt = DateTimeImmutable::createFromFormat('U', (string) 1718641845);$dt->format('Y-m-d'); // "2024-06-17

 

فانکشن جدید "grapheme_str_split"

اکستنشن Intl در پی اچ پی 8.4 یک فانکشن جدید اضافه کرده به نام grapheme_str_split. این فانکشن یک رشته (string) میگیره و اون رشته به آرایه ای از یونیکد سیستم. grapheme کوچکترین واحد معنادار و کاربردی یک سیستم زبانی است. اگه بخوایم این فانکشن با فانکشن mb_str_split بررسی کنیم مهم ترین تفاوت اینها این هست که فانکشن mb_str_split یک رشته به آرایه ای از کاراکتر یونیکد تبدیل میکند اما فانکشن grapheme_str_split یک رشته به آرایه ای از واحدهای سیستم نوشتاری تبدیل میکنه:

String
Unicode representation
grapheme_str_split output
Unicode representation
mb_str_split output
Unicode representation
PHP
0050 0048 0050
P + H + P
0050 + 0048 + 0050
P + H + P
0050 + 0048 + 0050
你好
4F60 597D
 + 
4F60 + 597D
 + 
4F60 + 597D
අයේෂ්
0D85 0DBA 0DDA 0DC2 0DCA
 + යේ + ෂ්
0D85U + 0DBA 0DDA + 0DC2 0DCA
 +  +  +  + 
0D85 + 0DBAU + 0DDAU + 0DC2U + 0DCA

 

فانکشن جدید "mb_ucfirst" و "mb_lcfirst"

ما در پی اچ پی فانکش هایی با نام ucfirst و lcfirst داریم. اکستنشن mbstring در پی اچ پی فانکشن هایی جدیدی اضافه کرده که مثل همین فانکشن هایی که گفتم هستند اما از بایت ها پشتیبانی میکنند و safe هستند. این فانکشن ها کاراکتر اول یک رشته به حروف بزرگ تغییر میدهند مثل milwad -> Milwad:

mb_ucfirst('test'); // Test
mb_ucfirst('TEST'); // TEST
mb_ucfirst('tEst'); // TEst
mb_ucfirst('tEst'); // TEst

mb_lcfirst('test'); // test
mb_lcfirst('TEST'); // tEST
mb_lcfirst('tEst'); // tEst
mb_lcfirst('tEst'); // TEst

 

مد جدید برای فانکشن round

شما به احتمال زیاد با فانکشن round کار کردید و میدونید که اعداد روند میکنه مثلا اگه عدد 3.2 هست با این متد 3.0 میشه یا .. . حالا یک پارامتر جدید براش درست کردند به نام mode و میتونید مشخص کنید که این عدد به صورت پیشفرض رو به بالا روند بشه یا پایین:

round(3.14, precision: 0, mode: PHP_ROUND_HALF_UP); // 3.0
round(3.14, precision: 1, mode: PHP_ROUND_HALF_UP); // 3.1
round(3.15, precision: 0, mode: PHP_ROUND_HALF_UP); // 3.0
round(3.5, precision: 0, mode: PHP_ROUND_HALF_UP); // 4.0

 

اضافه شدن بخش "PHP Integer Size" به phpinfo

از این به بعد شما میتونید در phpinfo میتونید PHP Integer Size ببینید. این عدد یعنی سیستم عامل شما در یک سیستم 64 بیتی، متغیرهای عدد صحیح می توانند مقادیر بسیار بزرگ تری را نسبت به سیستم های 32 بیتی در خود ذخیره کنند:

phpinfo

فانکشن جدید "request_parse_body"

ما اگه میخواستیم یک body درخواست خودمون رو بگیریم از "input" استفاده میکردیم، به مثال زیر توجه کنید:

curl --request PUT --location 'https://example.com/post.php' --form 'test="123"'

خب حالا اگه بخوایم دیتا بگیریم از زیر استفاده میکنیم:

echo file_get_contents('php://input'); 
/*
----------------------------690112416382325217174003
Content-Disposition: form-data;
name="test"123
----------------------------690112416382325217174003--
/*

اما الان میتونیم از این فانکشن جدید استفاده کنیم:

[$_POST, $_FILES] = request_parse_body();

 

اضافه شدن "feature_list" به فانکشن curl_version()

اگر از فانکشن curl_version() استفاده کرده باشید میدونید که یک آرایه از ورژن و.. curl به شما میده. در آپدیت جدید شما یک آیتم جدید در این آرایه دارید به نام feature_list که از قابلیت ها و چیز هایی که پشتیبانی میکنه در اونجا قرار میده:

[
    "version_number" => 524801,
    "age" => 10,
    "features" => 1438631837,
    "feature_list" => [
        "AsynchDNS" => true,
        "CharConv" => false,
        "Debug" => false,
        // ...
        "HTTP2" => true,
        "HTTPS_PROXY" => true,
        "BROTLI" => true,
        "ALTSVC" => true,
        "HTTP3" => false,
        "ZSTD" => true,
        "HSTS" => true,
        // ...
    ],
    "ssl_version_number" => 0,
    "version" => "8.2.1",
    "host" => "x86_64-pc-linux-gnu",
    // ...
]

 

اضافه شدن متد های "setMicrosecond" و "getMicrosecond" به DateTime

شما میتونید با این متد های جدید میکروثانیه ها ست یا get کنید در کلاس DateTime:

// 2024-02-06 08:40:46.899561 UTC (+00:00)
$date = new DateTime();$date->setMicrosecond(426286);

$date->getMicrosecond(); // (int) 426286

 

# منسوخ شده ها:

 

ارسال بیشتر از 2 پارامتر به فانکشن "session_set_save_handler"

در پی اچ پی 8.4 شما دیگر نمی تونید بیشتر از 2 پارامتر برای فانکشن session_set_save_handler() ارسال کنید:

session_set_save_handler('my_session_open', 'my_session_close', 'my_session_read', 'my_session_write');

اگر کد بالا اجرا کنید این خطا دریافت میکنید:

Deprecated: Calling session_set_save_handler() with more than 2 arguments is deprecated

 

تغییر روش nullable کردن پارامتر ها

در حال حاضر شما برای nullable کردن یک پارامتر در یک فانکشن به صورت زیر عمل میکنید:

function test(string $test = null) {}

در حال حاضر همه چی درست کار میکنه اما در پی اچ پی 8.4 باید به شکل زیر عمل کنید:

function test(?string $test = null) {}

 

مسنوخ شدن "CURLOPT_BINARYTRANSFER"

در پی اچ پی 8.4 ثابتی وجود داشت به نام CURLOPT_BINARYTRANSFER که منسوخ شد.

 

# حذف شده ها:

 

منتقل شدن اکستنشن Pspell

در ورژن جدید پی اچ پی، اکستنشن Pspell از هسته به PECL منتقل شد به دلیل تغییرات کم و.. .

 

منتقل شدن اکستنشن IMAP

ورژن جدید پی اچ پی، اکستنشن IMAP از هسته به PECL منتقل شد به دلیل تغییرات کم و.. .

 

منتقل شدن اکستنشن OCI8 و PDO-OCI

در ورژن جدید پی اچ پی، اکستنشن OCI8 و PDO-OCI از هسته به PECL منتقل شد به دلیل تغییرات کم و.. . این اکستنشن با دیتابیس Oracle کار میکرد.

 

# تغییرات لاجیک (Logic):

 

عوض شدن cost از 10 به 12 در Bcrypt

در هش کردن مقدار cost از 10 به 12 تغییر داده شده:

password_hash('hunter2', PASSWORD_BCRYPT); // cost => 12
// "$2y$10$GUYJOA4aWc6HegA2x.85PeZ9yjP2HCKFjb44C3vz1jlpUNb4AgYz2"

password_hash('hunter2', PASSWORD_BCRYPT, ['cost' => 10]);
// "$2y$10$dI8qa2bKk/RN2hemdHkOgu8oICMn7ivhzVyJmiJmNFzjJpYsLEAYK"

 

نشون دادن خطا "ValueError" برای پارامتر mode در فانکشن round

round(num: 3.14, mode: 42); // Invalid $mode parameter ValueError: round(): Argument #3 ($mode) must be a valid rounding mode (PHP_ROUND_*).

 

تغییر مقدار ثابت PHP_ZTS و PHP_DEBUG از int به bool

در پی اچ پی ثابت PHP_ZTS و PHP_DEBUG برای نمایش اطلاعات ران تایم پی اچ پی بودند. در پی اچ پی 8.4 مقدار این دو ثابت عدد (int) بود ولی در حال حاضر به bool تغییر کردند:

if (PHP_ZTS === 1) {} ❌
if (PHP_ZTS) {} ✅

if (PHP_DEBUG === 1) {} ❌
if (PHP_DEBUG) {} ✅

 

امیدوارم لذت برده باشی و با کامنتت از این مطلب فوق سخت حمایت کنی 💜

0 🔥
0 🎉
0 😮
0 👍
0 💜
1 👏
میلاد خسروی
نویسنده کد نیوز

برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.

2+ نظر

برای ثبت نظر ابتدا ورود کنید.

2 نظر