لم يتبق سوى بضعة أشهر حتى يتم إصدار PHP 8 ، وهناك بالفعل الكثير من الأشياء الجيدة في هذا الإصدار. تحت الخفض ، سنخبرك كيف بدأت هذه الابتكارات بالفعل في تغيير نهج المؤلف في كتابة التعليمات البرمجية.
المشتركون في الحدث مع السمات
سأحاول عدم الإفراط في استخدام السمات ، ولكن في حالة إعداد مستمعين للأحداث ، على سبيل المثال ، فهي مفيدة للغاية.
لقد كنت أعمل مؤخرًا على أنظمة حيث كان هناك الكثير من مثل هذا الإعداد. لنأخذ مثالا:
class CartsProjector implements Projector
{
use ProjectsEvents;
protected array $handlesEvents = [
CartStartedEvent::class => 'onCartStarted',
CartItemAddedEvent::class => 'onCartItemAdded',
CartItemRemovedEvent::class => 'onCartItemRemoved',
CartExpiredEvent::class => 'onCartExpired',
CartCheckedOutEvent::class => 'onCartCheckedOut',
CouponAddedToCartItemEvent::class => 'onCouponAddedToCartItem',
];
public function onCartStarted(CartStartedEvent $event): void
{ /* … */ }
public function onCartItemAdded(CartItemAddedEvent $event): void
{ /* … */ }
public function onCartItemRemoved(CartItemRemovedEvent $event): void
{ /* … */ }
public function onCartCheckedOut(CartCheckedOutEvent $event): void
{ /* … */ }
public function onCartExpired(CartExpiredEvent $event): void
{ /* … */ }
public function onCouponAddedToCartItem(CouponAddedToCartItemEvent $event): void
{ /* … */ }
}
سمات PHP 7 في PHP 8 لها ميزتان:
- يتم تجميع الكود الخاص بإعداد مستمعي ومعالجات الأحداث في مكان واحد ، ولا يتعين علي التمرير إلى البداية لمعرفة ما إذا كان المستمع قد تم إعداده بشكل صحيح.
- لم أعد بحاجة إلى القلق بشأن كتابة أسماء الأساليب ومعالجتها كسلاسل (عندما يتعذر على IDE إكمالها تلقائيًا ، لا يوجد تحليل ثابت للأخطاء المطبعية ولا تعمل طرق إعادة التسمية).
class CartsProjector implements Projector
{
use ProjectsEvents;
@@SubscribesTo(CartStartedEvent::class)
public function onCartStarted(CartStartedEvent $event): void
{ /* … */ }
@@SubscribesTo(CartItemAddedEvent::class)
public function onCartItemAdded(CartItemAddedEvent $event): void
{ /* … */ }
@@SubscribesTo(CartItemRemovedEvent::class)
public function onCartItemRemoved(CartItemRemovedEvent $event): void
{ /* … */ }
@@SubscribesTo(CartCheckedOutEvent::class)
public function onCartCheckedOut(CartCheckedOutEvent $event): void
{ /* … */ }
@@SubscribesTo(CartExpiredEvent::class)
public function onCartExpired(CartExpiredEvent $event): void
{ /* … */ }
@@SubscribesTo(CouponAddedToCartItemEvent::class)
public function onCouponAddedToCartItem(CouponAddedToCartItemEvent $event): void
{ /* … */ }
}
PHP 8
كتل ثابتة بدلاً من doc
هذا ليس تغييرًا كبيرًا ، لكني أراه كل يوم. غالبًا ما أجد أنني ما زلت بحاجة إلى كتل doc عندما أحتاج إلى تحديد أن الوظيفة لها نوع إرجاع ثابت.
إذا كنت بحاجة إلى كتابة PHP 7.4:
/**
* @return static
*/
public static function new()
{
return new static();
}
PHP 7.4
فهذا يكفي الآن:
public static function new(): static
{
return new static();
}
PHP 8
DTO ، تمرير الخصائص والوسيطات المسماة
لقد كتبت قليلاً عن استخدام نظام نوع PHP ونمط DTO ( كائنات نقل البيانات ). بطبيعة الحال ، أستخدم DTOs كثيرًا في الكود الخاص بي ، لذا يمكنك أن تتخيل مدى سعادتي لأتمكن الآن من إعادة كتابة هذا:
class CustomerData extends DataTransferObject
{
public string $name;
public string $email;
public int $age;
public static function fromRequest(
CustomerRequest $request
): self {
return new self([
'name' => $request->get('name'),
'email' => $request->get('email'),
'age' => $request->get('age'),
]);
}
}
$data = CustomerData::fromRequest($customerRequest);
PHP 7.4
هنا ، هذا أفضل:
class CustomerData
{
public function __construct(
public string $name,
public string $email,
public int $age,
) {}
}
$data = new CustomerData(...$customerRequest->validated());
PHP 8
لاحظ استخدام تمرير خصائص المُنشئ كمعلمات مسماة. نعم ، يمكن تمريرها باستخدام المصفوفات المسماة وعامل السبريد.
تعداد وتطابق
هل تستخدم تعدادًا مع بعض الطرق التي تُرجع نتيجة بناءً على القيمة المحددة من التعداد؟
/**
* @method static self PENDING()
* @method static self PAID()
*/
class InvoiceState extends Enum
{
private const PENDING = 'pending';
private const PAID = 'paid';
public function getColour(): string
{
return [
self::PENDING => 'orange',
self::PAID => 'green',
][$this->value] ?? 'gray';
}
}
PHP 7.4
أود أن أقول أنه في الحالات الأكثر تعقيدًا ، من الأفضل استخدام نمط الحالة ، ولكن هناك حالات يكون فيها التعداد كافياً. صيغة المصفوفة الغريبة هذه هي بالفعل اختصار لتعبير شرطي أكثر تعقيدًا:
/**
* @method static self PENDING()
* @method static self PAID()
*/
class InvoiceState extends Enum
{
private const PENDING = 'pending';
private const PAID = 'paid';
public function getColour(): string
{
if ($this->value === self::PENDING) {
return 'orange';
}
if ($this->value === self::PAID) {
return 'green'
}
return 'gray';
}
}
PHP 7.4 - بديل
ولكن في PHP 8 يمكننا استخدام المطابقة بدلاً من ذلك.
/**
* @method static self PENDING()
* @method static self PAID()
*/
class InvoiceState extends Enum
{
private const PENDING = 'pending';
private const PAID = 'paid';
public function getColour(): string
{
return match ($this->value) {
self::PENDING => 'orange',
self::PAID => 'green',
default => 'gray',
};
}
PHP 8
ينضم بدلاً من كتل المستندات
يعمل هذا بطريقة مشابهة لما تم وصفه مسبقًا لنوع الإرجاع الثابت.
/**
* @param string|int $input
*
* @return string
*/
public function sanitize($input): string;
PHP 7.4
public function sanitize(string|int $input): string;
PHP 8
استثناءات الرمي
في السابق ، لم يكن بإمكانك استخدام الرمية في التعبير ، مما يعني أنه كان عليك كتابة ، على سبيل المثال ، عمليات التحقق التالية:
public function (array $input): void
{
if (! isset($input['bar'])) {
throw BarIsMissing::new();
}
$bar = $input['bar'];
// …
}
PHP 7.4
في PHP 8 ، أصبح الرمي تعبيرًا ، مما يعني أنه يمكنك استخدامه على النحو التالي:
public function (array $input): void
{
$bar = $input['bar'] ?? throw BarIsMissing::new();
// …
}
PHP 8
مشغل Nullsafe
إذا كنت معتادًا على عامل التوحيد الصفري ، فإنك تدرك عيوبه: فهو لا يعمل مع استدعاءات الطريقة. لذلك ، غالبًا ما كنت بحاجة إلى فحوصات وسيطة أو وظائف إطار عمل مناسبة لهذا الغرض:
$startDate = $booking->getStartDate();
$dateAsString = $startDate ? $startDate->asDateTimeString() : null;
PHP 7.4
مع إدخال العامل nullsafe ، يمكنني حل هذه المشكلة بسهولة أكبر.
$dateAsString = $booking->getStartDate()?->asDateTimeString();
PHP 8
ما هي الابتكارات في PHP 8 التي تعتبرها مهمة؟
إعلان
خوادم لتطوير واستضافة مشاريعك. كل خادم متصل بقناة 500 ميغابت محمية من هجمات DDoS ، ومن الممكن استخدام شبكة محلية عالية السرعة. نحن نقدم مجموعة واسعة من خطط التعرفة ، تغيير التعريفة بنقرة واحدة. لوحة تحكم خادم مريحة للغاية والقدرة على استخدام API. اسرع للتحقق!
