در اینجا موارد جدید و بهبود یافته آمده است
انتشار: آبان 17، 1403
بروزرسانی: 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