ميزة 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 إذا لزم الأمر.
نقطة أساسية: تلغي ترقية المُنشئ الحاجة إلى تكرار تعريفات الخصائص وعمليات إسنادها، مما يجعل فئاتك أكثر تنظيمًا وأسهل قراءة، مع الحفاظ على التحكم الكامل في التغليف.
التحدي
سهللنبنِ نظامًا لإدارة جهات الاتصال يعرض أناقة 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"
getFullDetails()تُرجع"[name] | [email] | [phone]". أضف أيضًا method باسمgetSummary()تُرجع"Contact: [name]".- خاصية
main.php: أدرج ملف Contact. ستتلقى three مدخلات: اسمًا، وبريدًا إلكترونيًا، ورقم هاتف. أنشئ مثيلين منContact:- يجب أن تستخدم جهة الاتصال الأولى all القيم الثلاث (الاسم، والبريد الإلكتروني، والهاتف)
- يجب أن تستخدم جهة الاتصال الثانية only الاسم والبريد الإلكتروني (مع الاعتماد على قيمة الهاتف الافتراضية)
- التفاصيل الكاملة لجهة الاتصال الأولى
- ملخص جهة الاتصال الأولى
- التفاصيل الكاملة لجهة الاتصال الثانية
- ملخص جهة الاتصال الثانية
لاحظ كيف يتيح لك 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: اطبع ملخص جهة الاتصال الثانية
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsالكلمة المفتاحية $thisالـ Methodsالـ Propertiesالمنشئ (__construct)الهادم (__destruct)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةالكلمة المفتاحية parent::إعادة تعريف الدوال (Method Overriding)الكلمة المفتاحية finalالأصناف المجردة (Abstract Classes)مراجعة - هيكلية الموظفين7التغليف (Encapsulation)
العام، المحمي، الخاص (Public, Protected, Private)نظرة متعمقة على معدلات الوصولدوال Getters و Settersإخفاء المعلوماتميزة Constructor Promotion (8.0)مراجعة - نظام سجلات الطلاب10مفاهيم البرمجة كائنية التوجه المتقدمة
التركيب مقابل الوراثةحقن التبعيةالأصناف المجهولةالتعدادات (PHP 8.1)الألياف (PHP 8.1)تعمق في استنساخ الكائناتالمولدات والمكررات13أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع2مساحات الأسماء والتحميل التلقائي
مقدمة إلى مساحات الأسماءالكلمة المفتاحية useمعيار التحميل التلقائي PSR-4أداة التحميل التلقائي Composerملخص - مشروع منظم5الواجهات والعقود
مقدمة إلى الواجهاتتنفيذ الواجهاتتنفيذ واجهات متعددةالواجهة مقابل الـ Abstract Classالـ Type Hinting مع الواجهاتملخص - حاسبة الأشكال8الميثودات السحرية (Magic Methods)
مقدمة في الميثودات السحرية__toString و __debugInfo__get, __set, __isset, __unset__call و __callStatic__clone واستنساخ الكائنات__serialize و __unserializeمراجعة - Custom Collection3خصائص الكلاس
خصائص الـ Instance مقابل الخصائص الساكنة (Static)الثوابت في الكلاساتالدوال والخصائص الساكنة (Static)الخصائص الخاصة (Private) والمحمية (Protected)خصائص للقراءة فقط (Readonly) في PHP 8.1مراجعة - مدير الحساب البنكي6تعدد الأشكال (Polymorphism)
مراجعة إعادة تعريف الدوال (Method Overriding)تعدد الأشكال عبر الـ Interfacesتلميح النوع (Type Hinting) وأنواع الاتحاد (Union Types)الربط الاستاتيكي المتأخر (Late Static Binding)ملخص - معالج الدفع (Payment Processor)تدرّب بنفسك: مترجم PHP عبر الإنترنت