بروزرسانی: 30 خرداد 1404
در اینجا موارد جدید و بهبود یافته آمده است
ادویه کدو حلوایی در هوا است، بنابراین وقت آن رسیده است که نسخه جدیدی از PHP، زبان برنامه نویسی سمت سرور که CMS مورد علاقه ما، وردپرس را تقویت می کند، ارائه کنیم. تا پیش از عرضه نسخه 8.4 GA در 21 نوامبر، توسعه دهندگان PHP از نسخه های اولیه متعددی از پایگاه کد جدید، از جمله تعداد معدودی از نامزدهای انتشار پس از مسدود شدن ویژگی های اوت، پرده برداری کردند.
در کنار ویژگی های جدید، بهبودها و حذف شده ها، پیش بینی می کنیم در این زمان از سال، سال 2024 شاهد تغییراتی در چرخه انتشار PHP بود، با پایان نسخه های امنیتی برای همه نسخه های پشتیبانی شده در حال حاضر به جای تولد GA، همگام سازی شده با پایان سال.
علاوه بر این، این پشتیبانی یک سال تمدید شد، به این معنی که می توانید تا سال 2028 با خیال راحت از PHP 8.4 استفاده کنید (با دو سال رفع اشکالات و دو سال امنیت).
در حالی که ممکن است بتوانید زمان بیشتری را با PHP 8.4 سپری کنید، احتمالاً می خواهید بدانید که چه چیزهای جدیدی در این نسخه در حال حاضر وجود دارد. بنابراین، بیایید وارد شویم.
ویژگی ها و پیشرفت های جدید در PHP 8.4
ویژگی های جدید موجود در نسخه PHP 8.3 در سال گذشته در مقایسه با برخی از موارد اضافه شده در نسخه 8.4 کم کلید به نظر می رسند:
قلاب های ملکی
Property Hook یک رویکرد کاملاً جدید برای مدیریت «گیرنده» و «ستتر» در برنامه نویسی شی گرا (OOP) PHP به ارمغان می آورد و به شما امکان می دهد ساختار فایل های کلاس خود را ساده کنید.
به عنوان مثالی از آنچه که هوک های ویژگی می توانند جایگزین شوند، کلاس ساده زیر شامل ویژگی ها می شود $size
و $flavor
. آنها دارند private
دید برای محافظت از آنها در برابر دسترسی مستقیم به خارج از جسم حاصل. به همین دلیل است که متدهای دریافت کننده و تنظیم کننده عمومی دسترسی به ویژگی ها را واسطه می کنند:
class Coffee
{
private string $size;
private string $flavor;
public function __construct(string $size, string $flavor) {
$this->size = $size;
$this->flavor = $flavor;
}
// "Setting" coffee size and flavor
public function setSize(string $size): void {
$this->size = $size;
}
public function setFlavor(string $flavor): void {
$this->flavor = $flavor;
}
// "Getting" coffee size and flavor
public function getSize(): string {
return $this->size;
}
public function getFlavor(): string {
return $this->flavor;
}
} // End of class
// Make some coffee
$coffee = new Coffee(\'Small\', \'Pumpkin Spice\');
print $coffee->getSize() . \' \' . $coffee->getFlavor(); // Prints "Small Pumpkin Spice"
// Change order
$coffee->setSize(\'Grande\');
$coffee->setFlavor(\'Mocha\');
print $coffee->getSize() . \' \' . $coffee->getFlavor(); // Prints "Grande Mocha"
یا شاید کلاس شما ویژگی های زیادی داشته باشد و به جای نوشتن متدهای دریافت کننده و تنظیم کننده زیاد، از PHP استفاده کنید. _get
و _set
روش های جادویی حتی ممکن است مسائل را تا حدودی درهم و برهم مرتب کنید switch
بیانیه ای مانند این گزیده زیر
// __set magic method example
public function __set(string $key, $value): void
switch ($key) {
case \'size\':
$this->size = $value;
break;
case \'flavor\':
$this->flavor = $value;
break;
default:
throw new InvalidArgumentException(\'Invalid input\');
}
}
// Later, we can change the coffee order like this:
$coffee->size="Grande";
$coffee->flavor="Mocha";
هر رویکردی را که انتخاب کنید، هر چه ویژگی های بیشتری در کلاس خود داشته باشید، کد مورد استفاده برای دستکاری آنها از تعاریف آنها در بالای فایل کلاس شما دورتر خواهد بود. علاوه بر این، برخی از پیاده سازی های _get
و _set
روش های جادویی می توانند به طور غیرمنتظره ای دسترسی به ویژگی های خصوصی یا محافظت شده در شی شما را که قصد افشای آن ها را نداشتید، فراهم کنند.
قلاب های ویژگی جدید دارای عملکرد گیرنده و تنظیم کننده بسته ها با خود ویژگی ها هستند. در مثال قلاب ویژگی زیر، متوجه خواهید شد که $size
و $flavor
ویژگی های کلاس Coffee اکنون عمومی هستند. اما ما برخی از اعتبار سنجی اولیه را نیز به آن اضافه کرده ایم set
قلاب ها، آنها را از تکالیف مستقیم متمایز می کند.
// Property definitions at the top of our Coffee class
class Coffee
{
public string $flavor {
set(string $value) {
if (strlen($value) > 16) throw new InvalidArgumentException(\'Input is too long\');
$this->flavor = $value;
}
}
public string $size {
set(string $value) {
if (! in_array($value, array(‘Small’, ‘Grande’))) throw new InvalidArgumentException(\'Not a valid size\');
$this->size = $value;
}
}
// Rest of the Coffee class
}
// Define a coffee
$coffee = new Coffee();
$coffee->size="Grande";
$coffee->flavor="Pumpkin spice";
به همین ترتیب، همانطور که در زیر می بینید، الف get
هوک می تواند عملکردها را در مواردی که به نظر می رسد یک مرجع معمولی به یک ویژگی شی است، بسته بندی کند.
// Simplified Coffee class
class Coffee
{
public string $flavor {
get {
return $this->flavor . \' Spice\';
}
}
}
// Create a flavor
$coffee = new Coffee();
$coffee->flavor="Pumpkin"; // Stores the value "Pumpkin"
print $coffee->flavor; // Prints "Pumpkin Spice"
برخلاف متدهای جادویی PHP، هوک های ویژگی را می توان در رابط ها و کلاس های انتزاعی استفاده کرد. یک مثال رابط:
interface Coffee
{
public string $size { get; set; }
public string $flavor { get; set; }
}
دید نامتقارن
متدهای دریافت کننده و تنظیم کننده قابل مشاهده عمومی که قبلاً به آنها نگاه کردیم، رویکرد سنتی برای دسترسی به ویژگی های خصوصی و محافظت شده در کلاس های آنها را نشان می دهد.
یکی از ویژگی های خوب PHP 8.4 توانایی یک ویژگی برای داشتن سطوح مختلف دید بسته به زمینه ای است که در آن به آن دسترسی دارید. بنابراین، یک ویژگی ممکن است در هنگام خواندن عمومی باشد اما در هنگام تنظیم خصوصی یا محافظت شود.
این را بررسی کنید:
class Coffee
{
public private(set) string $flavor="Pumpkin Spice";
}
$coffee = new Coffee();
print $coffee->flavor; // Prints "Pumpkin Spice"
$coffee->flavor="Mocha"; // Error (visibility)
بالا، مال کلاس $flavor
ویژگی عمومی است مگر در یک زمینه تنظیم. در حال حاضر بسیار ساده است، اما دید نامتقارن حتی یک میانبر نیز دارد:
class Coffee
{
// public is assumed when the context is not setting
private(set) string $flavor="Pumpkin Spice";
}
برای انعطاف پذیری فوق العاده در کار با ویژگی های شی با دیدهای مختلف، می توانید از قلاب های ویژگی و دید نامتقارن در ترکیب استفاده کنید.
زنجیر زدن new
بدون پرانتز
صحبت از کوتاه نویسی، تماس گرفتن new
و روش های زنجیره ای که برای نیاز به قرار دادن فراخوان آن در پرانتز استفاده می شوند، مانند این:
$coffee = (new Coffee())->getFlavor()->getSize();
PHP 8.4 این اجازه را می دهد:
$coffee = new Coffee()->getFlavor()->getSize();
ممکن است تغییر جزئی به نظر برسد، اما انداختن تنها دو پرانتز خواندن و اشکال زدایی آن را بسیار آسان تر می کند.
توابع جدید برای یافتن آیتم های آرایه
از جمله "یعنی ما قبلاً نمی توانستیم این کار را انجام دهیم؟" بخش، PHP 8.4 این تابع را معرفی می کند array_find()
، که می تواند عناصر آرایه را برای اعضای مطابق با شرایط بیان شده در یک تابع تماس جستجو کند. این تابع مقدار اولین عنصر منطبق با آزمون برگشت تماس را برمی گرداند.
نسخه جدید شامل سه عملکرد مرتبط دیگر است:
array_find_key()
: دوست دارمarray_find()
، اما مقدار بازگشتی به جای مقدار خود عناصر، کلید عنصر منطبق است.array_all()
: برمی گرددtrue
اگر هر عنصر موجود در آرایه مورد آزمایش با آزمون برگشت تماس مطابقت دارد.array_any()
: برمی گرددtrue
اگر حداقل یکی عناصر موجود در آرایه با آزمون برگشت تماس مطابقت دارد.
توجه داشته باشید که دو تابع آخر به جای کلیدهای آرایه یا محتوا، نشانگرهای بولی را برمی گرداند.
در اینجا چند مثال سریع آورده شده است:
$array = (
\'a\' => \'Mocha\',
\'b\' => \'Caramel\',
\'c\' => \'Maple\',
\'d\' => \'Pumpkin\'
);
// Find the first flavor name that is 5 characters long
var_dump(array_find($array, function (string $value) {
return strlen($value) == 5;
})); // Returns “Mocha,” even though “Maple” is the same length
// Find the array key for the first flavor with a name longer than 5 characters.
var_dump(array_find_key($array, function (string $value) {
return strlen($value) > 5;
})); // Returns “b”
// Check to see if any flavor name is less than 5 characters long
var_dump(array_any($array, function (string $value) {
return strlen($value) < 5;
})); // Returns false
// Check to see if all flavor names are shorter than 8 characters
var_dump(array_all($array, function (string $value) {
return strlen($value) < 8;
})); // Returns true
تجزیه HTML5
HTM5 استاندارد واقعی برای ساختار صفحات وب مدرن است، اما فناوری تجزیه مدل شی سند (DOM) PHP در HTML 4.01 متوقف شده بود.
به جای ارتقاء موجود DOMDocument
کلاسی که با استانداردهای قدیمی تر HTML کار می کند، PHP 8.4 با یک کلاس جدید همراه است DomHTMLDocument
کلاسی که برای HTM5 آماده است.
شما می توانید محتویات یک صفحه HTML5 را مانند این وارد کنید:
$document = DomHTMLDocument::createFromString($html)
علاوه بر createFromString($html)
سازنده بالا، کلاس نیز پشتیبانی می کند createFromFile($path)
و createEmpty()
تجزیه کننده جدید تگ های معنایی HTML5 را می شناسد main
، article
و section
که اکنون برای اکثر ما آشنا هستند.
توابع برش چند بایتی
یکی دیگر از موارد اضافه شده در PHP 8.4 که به نظر می رسد مدت زیادی در راه است، پشتیبانی از چند بایت در توابع برش است:
mb_trim()
mb_ltrim()
mb_rtrim()
مانند PHP قدیمی trim()
عملکرد، mb_trim
فضای سفید و برخی از کاراکترهای خاص مانند فیدهای خط را از هر دو انتهای رشته که ممکن است دارای کاراکترهای چند بایتی باشد حذف می کند. سایر توابع انتهای چپ یا راست یک رشته را برش می دهند.
منسوخ شدن در PHP 8.4
هر نسخه از PHP لیستی از ویژگی ها و عملکردها (بعضی از آنها بسیار مبهم) را به همراه دارد که برای حذف نهایی از پلتفرم علامت گذاری شده اند. یکی از موارد منسوخ شده در PHP 8.4 ردیابی جلسه بدون کوکی است.
منسوخ شدن جلسات GET/POST
در حالی که کوکی ها به طور کلی روش ترجیحی برای ردیابی جلسات کاربر هستند، PHP از اصلاح داده های ID جلسه در پارامترهای GET/POST پشتیبانی می کند. برای فعال کردن ردیابی جلسه از طریق پارامترهای موجود در URL ها، تنظیمات PHP session.use_only_cookies
غیرفعال است و تنظیمات session.use_trans_sid
ممکن است فعال شود.
با PHP 8.4، هر یک از این حالت ها برای تنظیمات، یک هشدار منسوخ شدن را ایجاد می کند که ممکن است در گزارش های وب سایت شما ظاهر شود. وقتی PHP 9 منتشر شد، این تنظیمات دیگر در دسترس نخواهند بود.
سایر موارد منسوخ (و حذف) در PHP 8.4
در زیر لیستی از عملکردهایی است که توسط تیم پشتیبان PHP 8.4 برای منسوخ شدن هدف گذاری شده است. (برخی شامل پیوندهایی به اطلاعات بیشتر در مورد ویژگی ها هستند.،
- رسماً منسوخ شود
DOMDocument
وDOMEntity
خواص - حذف شد
DOMImplementation::getFeature($feature, $version)
. - منسوخ کردن
DOM_PHP_ERR
ثابت - برچسب "S" را در آن منسوخ کنید
unserialize()
. - منسوخ کردن
session.sid_length
وsession.sid_bits_per_character
. - منسوخ کردن
SplFixedArray::__wakeup()
. - منسوخ کردن
xml_set_object()
وxml_set_*_handler()
با نام روش های رشته ای - عبور از null و false را منسوخ کنید
dba_key_split()
. - انتقال انواع داده های نادرست برای گزینه ها برای توابع ext/hash منسوخ شود.
- ثابت ها را منسوخ کنید
SUNFUNCS_RET_STRING
،SUNFUNCS_RET_DOUBLE
،SUNFUNCS_RET_TIMESTAMP
. - مکانیسم فرار اختصاصی CSV را منسوخ کنید.
- منسوخ کردن
E_STRICT
ثابت - منسوخ کردن
strtok()
. - مقادیر غیر رشته ای را از کنترل کننده خروجی کاربر منسوخ کنید.
- تولید خروجی در کنترلر خروجی کاربر را منسوخ کنید.
- منسوخ کردن
file_put_contents()
با$data
به عنوان یک آرایه - منسوخ کردن
mysqli_ping()
وmysqli::ping()
- منسوخ کردن
mysqli_refresh()
. - منسوخ کردن
mysqli_kill()
. - پارامتر دوم را منسوخ کنید
mysqli_store_result()
. - منسوخ کردن
lcg_value()
. - منسوخ کردن
uniqid()
. - منسوخ کردن
md5()
،sha1()
،md5_file()
، وsha1_file()
. - رد کردن
E_USER_ERROR
بهtrigger_error()
. - با استفاده از یک زیرخط منفرد («_») به عنوان نام کلاس منسوخ کنید.
- منسوخ کردن
SOAP_FUNCTIONS_ALL
ثابت و انتقال آن بهSoapServer::addFunction()
.
خلاصه
PHP 8.4 با تغییرات جالبی همراه است. ما مشتاقیم که این نسخه را به زودی برای محک زدن سالانه PHP در سرورهای خود دریافت کنیم - آزمایش ما با سیستم های مدیریت محتوای مختلف مبتنی بر PHP.
ما همچنین علاقه مندیم ببینیم که چه زمانی توسعه دهندگان شروع به ترکیب برخی از ویژگی های جدید PHP 8.4 در پروژه های خود می کنند، به ویژه قلاب های دارایی.
کدام ویژگی های PHP 8.4 مورد علاقه شما هستند؟ نظرات خود را با انجمن ما در نظرات به اشتراک بگذارید!