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

الخصائص الخاصة (Private) والمحمية (Protected)

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

حتى الآن، استخدمنا خصائص public يمكن الوصول إليها من أي مكان. لكن في بعض الأحيان تحتاج إلى تقييد الوصول لحماية بياناتك. توفّر PHP معدِّلين إضافيين للرؤية: private وprotected.

لا يمكن الوصول إلى الخاصية private إلا من داخل الفئة التي تعرّفها:

<?php
class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();

المخرجات:

100

ستؤدي محاولة الوصول إلى $account->balance مباشرةً من خارج الفئة إلى حدوث خطأ. وهذا يحمي الرصيد من التغيير دون المرور عبر الطريقة deposit.

تعمل الخاصية protected بطريقة مماثلة، ولكن يمكن أيضًا الوصول إليها من قِبل الفئات الابنة التي ترث من الفئة parent:

<?php
class User {
    protected $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

class Admin extends User {
    public function showEmail() {
        return $this->email;
    }
}

$admin = new Admin("admin@example.com");
echo $admin->showEmail();

المخرجات:

admin@example.com

النقطة الأساسية: استخدم private عندما يجب أن تتمكن الفئة التي تعرّف الخاصية فقط من الوصول إليها. استخدم protected عندما تحتاج الفئات الابنة أيضًا إلى الوصول إليها. يمنع كلاهما الوصول الخارجي المباشر، مما يحافظ على أمان الحالة الداخلية لكائنك.

challenge icon

التحدي

سهل

لنبنِ نظامًا آمنًا لإدارة الموظفين يوضّح كيفية حماية البيانات الحساسة باستخدام الخاصيتين private و protected.

ستنشئ ثلاثة ملفات تعمل معًا لإدارة معلومات الموظفين مع التحكم المناسب في Access:

  • Employee.php: Define فئة Employee تعمل كأساس لجميع الموظفين. يجب أن تحتوي على خاصية protected $name (حتى تتمكن الفئات الابنة من الوصول إليها) وخاصية private $salary (يجب أن تكون هذه الفئة وحدها قادرة على تعديل الرواتب مباشرة). يقبل constructor اسمًا وراتبًا، ويضبط الخاصيتين. أضف method عامة getName() تُعيد الاسم، وmethod عامة getSalary() تُعيد الراتب، وmethod عامة giveRaise($amount) تزيد الراتب بالمقدار المُعطى.
  • Manager.php: Define فئة Manager تمتد من Employee. ضمّن ملف Employee في الأعلى. أضف خاصية $department من النوع private. يجب أن يقبل constructor الاسم والراتب والقسم: استدعِ constructor الخاص بـ parent باستخدام parent::__construct($name, $salary)، ثم اضبط القسم. Create method باسم getDetails() تُعيد "[name] manages [department]" من خلال الوصول إلى الخاصية $name من النوع protected مباشرةً. أضف أيضًا method باسم getDepartment() تُعيد القسم.
  • main.php: ضمّن ملفَي الفئتين. Create كائنًا من Manager بالاسم "Sarah"، والراتب 75000، والقسم "Engineering". Print تفاصيل المدير باستخدام getDetails(). ثم امنح المدير زيادة قدرها 5000 واطبع راتبه الجديد باستخدام getSalary(). يجب أن يكون كل ناتج في سطر مستقل.

لاحظ كيف تستطيع فئة Manager الوصول إلى الخاصية $name من النوع protected مباشرةً، لكنها يجب أن تستخدم method getSalary() للوصول إلى الراتب private. يوضّح هذا الفرق الأساسي بين مستوى الرؤية protected و private: يتيح protected وصول الفئة الابنة، بينما يُبقي private البيانات مخفيةً تمامًا.

جرّب بنفسك

<?php
require_once 'Employee.php';
require_once 'Manager.php';

// TODO: أنشئ Manager بالاسم "Sarah" والراتب 75000 والقسم "Engineering"

// TODO: اطبع تفاصيل المدير باستخدام getDetails()

// TODO: امنح المدير زيادة بمقدار 5000

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

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

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

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