Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

ميزة Constructor Promotion (8.0)

جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 42 من 91.

قدّم PHP 8.0 ميزة constructor promotion، وهي ميزة تقلّل بشكل كبير من التعليمات البرمجية المتكررة عند تعريف الأصناف. بدلًا من التصريح عن properties بشكل منفصل ثم إسنادها في constructor، يمكنك القيام بالأمرين في خطوة واحدة.

إليك النهج التقليدي الذي كنت تستخدمه:

<?php
class Product {
    private string $name;
    private float $price;
    
    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
    
    public function getInfo(): string {
        return $this->name . ": $" . $this->price;
    }
}

مع ترقية المُنشئ، تضيف مُعدِّل الوصول مباشرةً إلى مُعاملات المُنشئ:

<?php
class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
    
    public function getInfo(): string {
        return $this->name . ": $" . $this->price;
    }
}

$product = new Product("Laptop", 999.99);
echo $product->getInfo();

المخرجات:

Laptop: $999.99

عند إضافة private أو protected أو public قبل مُعامل في constructor، ينشئ PHP الخاصية ويُسنِد القيمة إليها تلقائيًا. يمكنك المزج بين المُعاملات promoted والاعتيادية في constructor نفسه، ولا يزال بإمكانك إضافة منطق داخل جسم constructor إذا لزم الأمر.

نقطة أساسية: تلغي ترقية المُنشئ الحاجة إلى تكرار تعريفات الخصائص وعمليات إسنادها، مما يجعل فئاتك أكثر تنظيمًا وأسهل قراءة، مع الحفاظ على التحكم الكامل في التغليف.

challenge icon

التحدي

سهل

لنبنِ نظامًا لإدارة جهات الاتصال يعرض أناقة constructor promotion. ستنشئ class حديثة ونظيفة في PHP تتخلص من التعليمات البرمجية المتكررة مع الحفاظ على encapsulation السليمة.

ستنظم تعليماتك البرمجية عبر ملفين:

  • Contact.php: أنشئ class باسم Contact باستخدام constructor promotion لتعريف all properties مباشرةً في توقيع constructor. يجب أن تحتوي جهة الاتصال على:
    • خاصية $name من النوع string ومرئية private
    • خاصية $email من النوع string ومرئية private
    • خاصية $phone من النوع string ومرئية private، بقيمة default هي "Not provided"
    استخدم صيغة constructor promotion: لا حاجة إلى تعريفات منفصلة للخصائص! Add method عامة باسم getFullDetails() تُرجع "[name] | [email] | [phone]". أضف أيضًا method باسم getSummary() تُرجع "Contact: [name]".
  • main.php: أدرج ملف Contact. ستتلقى three مدخلات: اسمًا، وبريدًا إلكترونيًا، ورقم هاتف. أنشئ مثيلين من Contact:
    • يجب أن تستخدم جهة الاتصال الأولى all القيم الثلاث (الاسم، والبريد الإلكتروني، والهاتف)
    • يجب أن تستخدم جهة الاتصال الثانية only الاسم والبريد الإلكتروني (مع الاعتماد على قيمة الهاتف الافتراضية)
    اطبع four أسطر:
    • التفاصيل الكاملة لجهة الاتصال الأولى
    • ملخص جهة الاتصال الأولى
    • التفاصيل الكاملة لجهة الاتصال الثانية
    • ملخص جهة الاتصال الثانية

لاحظ كيف يتيح لك constructor promotion تعريف properties، وتعيين مستوى رؤيتها، والتصريح بأنواعها، وإسناد القيم إليها: all في توقيع constructor واحد سهل القراءة. يوضح معامل الهاتف الاختياري ذو القيمة default أن المعاملات المُرقّاة تعمل بسلاسة مع القيم الافتراضية، تمامًا مثل المعاملات العادية.

جرّب بنفسك

<?php

require_once 'Contact.php';

// قراءة المدخلات
$name = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));

// TODO: أنشئ جهة الاتصال الأولى بجميع القيم الثلاث (name, email, phone)

// TODO: أنشئ جهة الاتصال الثانية بالاسم والبريد الإلكتروني فقط (استخدم الهاتف الافتراضي)

// TODO: اطبع التفاصيل الكاملة لجهة الاتصال الأولى

// TODO: اطبع ملخص جهة الاتصال الأولى

// TODO: اطبع التفاصيل الكاملة لجهة الاتصال الثانية

// TODO: اطبع ملخص جهة الاتصال الثانية

?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم PHP عبر الإنترنت