خصائص للقراءة فقط (Readonly) في PHP 8.1
جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 19 من 91.
قدّم PHP 8.1 خصائص readonly، التي يمكن تعيينها مرة واحدة فقط ولا يمكن تعديلها بعد ذلك. وعلى عكس الثوابت، يتم تعيين خصائص readonly أثناء تهيئة الكائن بدلاً من وقت تعريف الفئة.
تُعلن عن خاصية readonly بإضافة الكلمة المفتاحية readonly قبل تعريف النوع:
<?php
class User {
public readonly string $id;
public readonly string $name;
public function __construct(string $id, string $name) {
$this->id = $id;
$this->name = $name;
}
}
$user = new User("U001", "Alice");
echo $user->id . "\n";
echo $user->name;
الناتج:
U001
Aliceبمجرد تعيينها، ستؤدي محاولة تغيير property readonly إلى حدوث خطأ. وهذا يجعلها مثالية لـ values التي ينبغي أن تظل ثابتة طوال فترة حياة object، مثل المعرّفات أو الطوابع الزمنية للإنشاء.
يجب أن تحتوي properties readonly على إعلان نوع، ولا يمكن تعيينها إلا مرة واحدة من داخل class المعلنة (عادةً في constructor). وعلى عكس properties العادية، لا يمكن منحها قيمة افتراضية عند التصريح بها. وهي تعمل مع أي مُعدِّل للرؤية:
<?php
class Product {
public function __construct(
public readonly string $sku,
private readonly float $cost
) {}
public function getCost(): float {
return $this->cost;
}
}
$product = new Product("ABC123", 29.99);
echo $product->sku;
المخرجات:
ABC123النقطة الأساسية: توفر الخصائص readonly عدم القابلية للتغيير على مستوى الخاصية. وهي مثالية للبيانات التي تحدد هوية كائن أو التي ينبغي ألّا تتغير بعد الإنشاء، إذ تجمع بين مرونة التهيئة أثناء التشغيل وأمان منع التعديلات غير المقصودة.
التحدي
سهللنَبْنِ نظام إعدادات غير قابل للتغيير يستخدم الخصائص readonly لضمان عدم تغيير الإعدادات الحرجة عن طريق الخطأ بعد التهيئة.
ستُنشئ ملفين يعملان معًا لإدارة إعدادات التطبيق:
Config.php: عرّف فئةConfigالتي تمثل إعدادات التطبيق مع إعدادات غير قابلة للتغيير. يجب أن تحتوي الفئة على ثلاث خصائص public readonly:string $appNameوstring $versionوint $maxConnections. استخدم ترقية المُنشئ لتعريف خصائص readonly الثلاث وتهيئتها في تعريف مُنشئ واحد ونظيف. أضف طريقةgetInfo()تُرجع string بالتنسيق"[appName] v[version] (max: [maxConnections] connections)".main.php: أدرج ملف فئة Config. ستتلقى three مدخلات: اسم التطبيق، والإصدار، والحد الأقصى للاتصالات (باعتباره string يحتاج إلى تحويله إلى عدد صحيح). أنشئ كائنConfigباستخدام هذه values. اطبع نتيجةgetInfo()في السطر الأول. ثم اطبع كل readonly property في سطر خاص بها من خلال الوصول إليها مباشرة: اسم التطبيق، والإصدار، والحد الأقصى للاتصالات.
تضمن خصائص readonly أنه بمجرد إنشاء إعدادات، تُثبَّت values في مكانها، ما يجعلها مثالية للإعدادات التي ينبغي أن تظل ثابتة طوال فترة تشغيل تطبيقك. لاحظ كيف أن الجمع بين ترقية المُنشئ وreadonly ينشئ طريقة موجزة جدًا لتعريف كائنات قيم غير قابلة للتغيير.
يجب أن يعرض الناتج string المعلومات المنسَّق متبوعًا بقيمة كل property على حدة، موضحًا أنه لا يزال من الممكن قراءة خصائص readonly من خارج الفئة.
REQUIRED OUTPUT FORMAT:جرّب بنفسك
<?php
require_once 'Config.php';
// اقرأ المدخلات
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));
// TODO: أنشئ كائن Config باستخدام قيم الإدخال
// TODO: اطبع نتيجة getInfo()
// TODO: اطبع كل خاصية readonly في سطرها الخاص:
// - اسم التطبيق
// - الإصدار
// - الحد الأقصى للاتصالات
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت