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

ميزة Constructor Promotion (8.0)

جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 42 من 91.

قدم إصدار PHP 8.0 ميزة ترقية المنشئ (constructor promotion)، وهي ميزة تقلل بشكل كبير من الكود المتكرر (boilerplate code) عند تعريف الأصناف (classes). فبدلاً من التصريح عن الخصائص بشكل منفصل ثم تعيين قيمها داخل المنشئ، يمكنك القيام بالأمرين معاً في خطوة واحدة.

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

<?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;
    }
}

مع خاصية ترقية المعاملات في المنشئ (constructor promotion)، يمكنك إضافة محدد الوصول مباشرة إلى معاملات المنشئ:

<?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 parameter)، يقوم PHP تلقائيًا بإنشاء الخاصية وتعيين القيمة. يمكنك المزج بين المعاملات المرقاة (promoted) والمعاملات العادية في نفس المنشئ، ولا يزال بإمكانك إضافة منطق برمج داخل جسم المنشئ إذا لزم الأمر.

نقطة رئيسية: تعمل ميزة ترقية المنشئ (Constructor promotion) على إزالة التصريحات والتعيينات المتكررة للخصائص، مما يجعل الفئات (classes) الخاصة بك أكثر نظافة وأسهل في القراءة مع الحفاظ على التحكم الكامل في التغليف (encapsulation).

challenge icon

التحدي

سهل

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

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • Contact.php — أنشئ فئة Contact باستخدام خاصية ترقية المنشئ لتعريف جميع الخصائص مباشرة في توقيع المنشئ. يجب أن تحتوي جهة الاتصال الخاصة بك على:
    • خاصية $name خاصة (string)
    • خاصية $email خاصة (string)
    • خاصية $phone خاصة (string) مع قيمة افتراضية هي "Not provided"
    استخدم صيغة ترقية المنشئ — لا حاجة لإعلانات خصائص منفصلة! أضف تابعاً عاماً getFullDetails() يعيد "[name] | [email] | [phone]". أضف أيضاً تابعاً getSummary() يعيد "Contact: [name]".
  • main.php — قم بتضمين ملف Contact. ستتلقى ثلاثة مدخلات: الاسم، والبريد الإلكتروني، ورقم الهاتف. أنشئ مثيلين (instances) من Contact:
    • يجب أن تستخدم جهة الاتصال الأولى جميع القيم الثلاث (الاسم، والبريد الإلكتروني، والهاتف)
    • يجب أن تستخدم جهة الاتصال الثانية الاسم والبريد الإلكتروني فقط (بالاعتماد على قيمة الهاتف الافتراضية)
    اطبع أربعة أسطر:
    • التفاصيل الكاملة لجهة الاتصال الأولى
    • ملخص جهة الاتصال الأولى
    • التفاصيل الكاملة لجهة الاتصال الثانية
    • ملخص جهة الاتصال الثانية

لاحظ كيف تتيح لك خاصية ترقية المنشئ تعريف الخصائص، وتحديد مدى رؤيتها، وإعلان أنواعها، وتعيين القيم — كل ذلك في توقيع منشئ واحد وقابل للقراءة. يوضح معامل الهاتف الاختياري ذو القيمة الافتراضية أن المعاملات التي تمت ترقيتها تعمل بسلاسة مع القيم الافتراضية، تماماً مثل المعاملات العادية.

ورقة مرجعية

قدم PHP 8.0 ميزة ترقية المنشئ (constructor promotion)، والتي تتيح لك التصريح عن خصائص الفئة وتهيئتها مباشرة في معاملات المنشئ عن طريق إضافة معدل وصول.

النهج التقليدي:

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

مع ميزة ترقية المنشئ:

<?php
class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
}

$product = new Product("Laptop", 999.99);

من خلال إضافة private أو protected أو public قبل معامل المنشئ، يقوم PHP تلقائياً بإنشاء الخاصية وتعيين القيمة لها.

يمكنك استخدام القيم الافتراضية مع المعاملات التي تمت ترقيتها:

<?php
class Contact {
    public function __construct(
        private string $name,
        private string $email,
        private string $phone = "Not provided"
    ) {}
}

يمكن دمج ترقية المنشئ مع المعاملات العادية، ولا يزال بإمكانك إضافة منطق برمج داخل جسم المنشئ إذا لزم الأمر.

جرّب بنفسك

<?php

require_once 'Contact.php';

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

// TODO: إنشاء جهة الاتصال الأولى بجميع القيم الثلاث (الاسم، البريد الإلكتروني، الهاتف)

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

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

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

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

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

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

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

جميع دروس Object Oriented Programming