برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.
پی اچ پی 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 outputUnicode representation |
mb_str_split outputUnicode 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 بیتی در خود ذخیره کنند:
فانکشن جدید "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) {} ✅
محمدحسین خادم المهدی
عالی
میلاد خسروی
خوشحالم که خوشت اومده