إخفاء المعلومات
جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 41 من 91.
إخفاء المعلومات هو المبدأ الكامن وراء التغليف — أي الفكرة القائلة بأن class يجب أن تكشف فقط ما هو ضروري وأن تخفي تفاصيل تنفيذها internal. وبينما تُعدّ معدِّلات الوصول وgetters/setters الأدوات المستخدمة، فإن إخفاء المعلومات هو فلسفة التصميم التي توجه كيفية استخدامك لها.
الهدف هو إنشاء حدّ واضح بين ما تفعله class (واجهتها public) وكيف تفعله (تنفيذها internal). يعني هذا الفصل أنه يمكنك تغيير أساليب العمل internal دون التأثير في الشيفرة التي تستخدم class:
<?php
class Temperature {
private float $celsius;
public function setCelsius(float $value): void {
$this->celsius = $value;
}
public function getCelsius(): float {
return $this->celsius;
}
public function getFahrenheit(): float {
return ($this->celsius * 9/5) + 32;
}
}
$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";
المخرجات:
25C = 77Fيخزّن class درجة الحرارة internally بوحدة Celsius، لكن لا يحتاج المستخدمون إلى معرفة ذلك. يمكنك لاحقًا تغيير التخزين internal إلى فهرنهايت أو كلفن، وما دامت الأساليب public لا تزال تعمل بالطريقة نفسها، فلن يتعطل أي كود خارجي.
النقطة الأساسية: تحمي إخفاء المعلومات شيفرتك من التغييرات. أخفِ تفاصيل التنفيذ، واكشف فقط الواجهات المستقرة، وستصبح فئاتك أسهل في الصيانة والتعديل بمرور الوقت.
التحدي
سهللنبنِ محوّل عملات يوضّح إخفاء المعلومات عمليًا. ستنشئ class تخزّن money داخليًا بعملة واحدة، لكنها تستطيع التحويل بسلاسة من وإلى عملات متعددة، من دون أن تعرف الشفرة الخارجية مطلقًا كيفية تخزين البيانات فعليًا.
ستنظّم شفرتك عبر ملفين:
Money.php: أنشئ class باسمMoneyتخزّن جميع المبالغ داخليًا بوحدة cents (باعتبارها integer) لتجنّب مشكلات دقة الأعداد ذات الفاصلة العائمة. يجب إخفاء تفاصيل التنفيذ هذه بالكامل عن مستخدمي class. يجب أن توفّر class ما يلي:- خاصية private لتخزين amount بوحدة cents
setDollars(float $amount): تقبل amount بوحدة dollars وتخزّنها داخليًا بوحدة centsgetDollars(): تعيد amount بوحدة dollars (float، مع منزلتين عشريتين)setEuros(float $amount): تقبل euros وتحولها إلى cents باستخدام السعر: 1 EUR = 1.10 USDgetEuros(): تعيد amount بعد تحويلها إلى euros (float، مع منزلتين عشريتين)getInternalValue(): تعيد القيمة الخام بوحدة cents (integer) لأغراض debugging
main.php: ضمّن ملف Money. ستتلقى مدخلين: amount بوحدة dollars وamount بوحدة euros. أنشئ كائنًا منMoney. أولًا، عيّن amount بوحدة dollars (بعد تحويلها إلى float) واطبع ثلاثة أسطر: قيمة dollars، والقيمة المكافئة بوحدة euros، وقيمة cents الداخلية. ثم عيّن amount بوحدة euros (بعد تحويلها إلى float) واطبع القيم الثلاث نفسها مرة أخرى.
يكمن جمال هذا التصميم في أن الشفرة الخارجية تتعامل مع قيم dollars وeuros المألوفة، من دون أن تدرك تمامًا أن كل شيء مخزّن داخليًا بوحدة cents. يمكنك لاحقًا تغيير التخزين internal لاستخدام عملة أساسية مختلفة أو استراتيجية دقة مختلفة، وطالما استمرت الطرق public في العمل بشكل صحيح، فلن تحتاج أي شفرة خارجية إلى التغيير.
نسّق جميع مخرجات dollars وeuros لتتضمن منزلتين عشريتين بالضبط. يجب طباعة كل قيمة في سطر مستقل، مما ينتج عنه إجمالي ستة أسطر من المخرجات.
جرّب بنفسك
<?php
require_once 'Money.php';
// اقرأ المدخلات
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: أنشئ كائن Money
// 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 عبر الإنترنت