ميزة 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).
التحدي
سهلدعونا نبني نظاماً لإدارة جهات الاتصال يستعرض أناقة خاصية ترقية المنشئ (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: طباعة ملخص لجهة الاتصال الثانية
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
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)