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

إخفاء المعلومات

جزء من قسم البرمجة كائنية التوجه في رحلة 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 لا تزال تعمل بالطريقة نفسها، فلن يتعطل أي كود خارجي.

النقطة الأساسية: تحمي إخفاء المعلومات شيفرتك من التغييرات. أخفِ تفاصيل التنفيذ، واكشف فقط الواجهات المستقرة، وستصبح فئاتك أسهل في الصيانة والتعديل بمرور الوقت.

challenge icon

التحدي

سهل

لنبنِ محوّل عملات يوضّح إخفاء المعلومات عمليًا. ستنشئ class تخزّن money داخليًا بعملة واحدة، لكنها تستطيع التحويل بسلاسة من وإلى عملات متعددة، من دون أن تعرف الشفرة الخارجية مطلقًا كيفية تخزين البيانات فعليًا.

ستنظّم شفرتك عبر ملفين:

  • Money.php: أنشئ class باسم Money تخزّن جميع المبالغ داخليًا بوحدة cents (باعتبارها integer) لتجنّب مشكلات دقة الأعداد ذات الفاصلة العائمة. يجب إخفاء تفاصيل التنفيذ هذه بالكامل عن مستخدمي class. يجب أن توفّر class ما يلي:
    • خاصية private لتخزين amount بوحدة cents
    • setDollars(float $amount): تقبل amount بوحدة dollars وتخزّنها داخليًا بوحدة cents
    • getDollars(): تعيد amount بوحدة dollars (float، مع منزلتين عشريتين)
    • setEuros(float $amount): تقبل euros وتحولها إلى cents باستخدام السعر: 1 EUR = 1.10 USD
    • getEuros(): تعيد 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: عيّن مبلغ اليورو واطبع:
// - قيمة الدولارات (منزلتان عشريتان)
// - المكافئ باليورو (منزلتان عشريتان)
// - قيمة السنتات الداخلية (عدد صحيح)

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

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم PHP عبر الإنترنت