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

نظرة متعمقة على معدلات الوصول

جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 39 من 91.

الآن بعد أن فهمت معدِّلات الوصول الثلاثة، لنستكشف كيفية تصرّفها في سيناريوهات التوريث. الفكرة الأساسية هي أن الأعضاء protected تصبح متاحة للفئات الابنة، بينما تظل الأعضاء private مخفية حتى عن الفئات الابنة.

<?php
class Vehicle {
    public $brand;
    protected $engineType;
    private $serialNumber;
    
    public function __construct($brand, $engine, $serial) {
        $this->brand = $brand;
        $this->engineType = $engine;
        $this->serialNumber = $serial;
    }
    
    private function getSerial() {
        return $this->serialNumber;
    }
    
    protected function getEngineInfo() {
        return $this->engineType;
    }
}

class Car extends Vehicle {
    public function getDetails() {
        return $this->brand . " - " . $this->getEngineInfo();
        // $this->serialNumber سيسبب خطأ - private!
        // $this->getSerial() سيفشل أيضًا - private method!
    }
}

$car = new Car("Toyota", "V6", "ABC123");
echo $car->getDetails();

المخرجات:

Toyota - V6

يمكن للفئة Car الوصول إلى $brand (عام) واستدعاء getEngineInfo() (محمي)، لكنها لا تستطيع الوصول إلى $serialNumber أو getSerial() لأنهما خاصان بالفئة Vehicle. يتيح لك هذا التمييز مشاركة بعض التفاصيل الداخلية مع الفئات الابنة، مع إبقاء التفاصيل الأخرى مخفية تمامًا.

النقطة الأساسية: استخدم protected عندما تحتاج الفئات الابنة إلى الوصول إلى البيانات أو الأساليب الداخلية، واستخدم private عندما لا ينبغي حتى للفئات الابنة لمس بعض تفاصيل التنفيذ.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لإدارة الأجهزة يستكشف كيفية تصرّف معدِّلات access عبر الوراثة. ستنشئ Device class أساسية تحتوي على properties بمستويات رؤية مختلفة، ثم توسّعها باستخدام Smartphone class توضّح أي أعضاء يمكن لـ child classes الوصول إليها وأيها cannot الوصول إليه.

ستنظّم الشيفرة عبر ثلاثة ملفات:

  • Device.php: أنشئ Device class تمثّل الأجهزة الإلكترونية ذات المستويات المختلفة من حساسية البيانات. أدرج ما يلي:
    • public property باسم $brand لاسم الشركة المصنّعة
    • protected property باسم $modelNumber للتعريف الداخلي
    • private property باسم $manufacturingCode لبيانات المصنع فقط
    يجب أن يقبل constructor القيم الثلاث كلها. أضف private method باسم getManufacturingCode() تُعيد manufacturing code. أضف public method باسم getModelInfo() تُعيد "Model: [modelNumber]". وأخيرًا، أضف public method باسم getFullCode() تُعيد "[brand]-[manufacturingCode]". يوضّح هذا كيف يمكن للـ class نفسه الوصول إلى أعضائه private الخاصة.
  • Smartphone.php: أنشئ Smartphone class تمتد من Device. أدرج ملف Device. يجب أن يقبل constructor brand وmodelNumber وmanufacturingCode واسم نظام operating. استدعِ parent constructor باستخدام القيم الثلاث الأولى، ثم خزّن OS في property خاصة. أضف public method باسم getDeviceDetails() تُعيد "[brand] [modelNumber] running [os]". لاحظ أنه يمكنك الوصول إلى $brand الـ public مباشرةً وإلى $modelNumber الـ protected، لكنك cannot الوصول إلى $manufacturingCode الـ private مباشرةً؛ إذ ستحتاج بدلًا من ذلك إلى استخدام public method الموروثة getFullCode().
  • main.php: أدرج ملف Smartphone. ستتلقى أربعة inputs: اسم brand، ورقم model، وmanufacturing code، ونظام operating. أنشئ instance من Smartphone بهذه القيم. اطبع ثلاثة أسطر:
    • نتيجة استدعاء getDeviceDetails()
    • نتيجة استدعاء method getModelInfo() الموروثة
    • نتيجة استدعاء method getFullCode() الموروثة

يسلّط هذا التحدي الضوء على التمييز الأساسي: يمكن لـ Smartphone class استخدام $modelNumber الـ protected الموروث من Device بحرية، لكن $manufacturingCode الـ private وgetManufacturingCode() يظلان مخفيين تمامًا: ولا يمكن الوصول إليهما إلا من خلال الواجهة العامة التي يختار Device كشفها.

جرّب بنفسك

<?php
require_once 'Smartphone.php';

// قراءة المدخلات
$brand = trim(fgets(STDIN));
$modelNumber = trim(fgets(STDIN));
$manufacturingCode = trim(fgets(STDIN));
$os = trim(fgets(STDIN));

// TODO: أنشئ كائن Smartphone بالقيم المدخلة

// TODO: اطبع نتيجة getDeviceDetails()

// TODO: اطبع نتيجة الدالة الموروثة getModelInfo()

// TODO: اطبع نتيجة الدالة الموروثة getFullCode()
?>
quiz iconاختبر نفسك

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

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

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