🛡️ التحكم في الوصول: شرح Access Modifiers في PHP
بعد أن تعلمت كيف تنشئ "كلاس" (Class) وتضيف إليه الخصائص والدوال، قد تتساءل: هل يمكنني منع أي شخص من تغيير قيمة معينة داخل الكلاس؟ أو هل يمكنني جعل بعض الدوال سرية لا يراها إلا الكلاس نفسه؟
هنا يأتي دور محددات الوصول (Access Modifiers). هي ببساطة كلمات نضعها قبل تعريف المتغير أو الدالة لنحدد "من يملك الصلاحية" للوصول إليها.
في PHP، لدينا ثلاثة أنواع أساسية من محددات الوصول:
- Public (عام) 🌍
- Protected (محمي) 🛡️
- Private (خاص) 🔒
1. المحدد العام public 🌍
هذا هو النوع الأكثر شيوعاً والأقل تقييداً. عندما نعرّف خاصية أو دالة بأنها public في PHP، فإننا نقول للعالم: "يمكن لأي شخص الوصول إلى هذا العنصر من أي مكان في الكود".
سواء كنت داخل الكلاس، أو خارج الكلاس (عن طريق الكائن/Object)، يمكنك قراءة أو تعديل هذه القيمة.
مثال عملي بسيط:
<?php
class Student {
// Public property: can be accessed from anywhere
public $name;
public function sayHello() {
return "Hello, my name is " . $this->name;
}
}
$student1 = new Student();
$student1->name = "Ahmed"; // Accessing public property from outside the class
echo $student1->sayHello(); // Output: Hello, my name is Ahmed
?>
2. المحدد الخاص private 🔒
على عكس public تماماً، المحدد private هو الأكثر تقييداً. عندما تجعل خاصية أو دالة private فإنك تقول: "هذا العنصر سري جداً، ولا يمكن الوصول إليه أو تعديله إلا من داخل الكلاس الذي عُرِف فيه فقط".
إذا حاولت الوصول إلى متغير private من خارج الكلاس، سيقوم PHP بإظهار خطأ (Error) فوراً.
مثال عملي بسيط:
<?php
class BankAccount {
// Private property: cannot be accessed from outside
private $balance = 1000;
public function showBalance() {
// We can access private properties INSIDE the class
return "Your balance is: " . $this->balance;
}
}
$account = new BankAccount();
echo $account->showBalance(); // This works! (Accessed via public method)
// The line below will cause an ERROR ❌
// echo $account->balance;
?>
لاحظ في المثال السابق أننا استطعنا رؤية الرصيد لأننا استخدمنا دالة عامة showBalance لتعطينا القيمة، لكننا لم نستطع لمس المتغير $balance مباشرة من الخارج.
3. المحدد المحمي protected 🛡️
هذا المحدد هو "الحل الوسط". هو يشبه الـ private في أنه يمنع الوصول من خارج الكلاس، ولكن لديه ميزة إضافية: يسمح للكلاسات التي "ترث" (Inherit) من هذا الكلاس بالوصول إلى هذه العناصر.
(ملاحظة: بما أننا لم نشرح الوراثة بالتفصيل بعد، تذكر فقط أن protected يُستخدم عندما تريد حماية البيانات من المستخدم الخارجي، ولكن تسمح "لأبنائك" من الكلاسات الأخرى برؤيتها).
مثال توضيحي سريع:
<?php
class ParentClass {
protected $message = "Hello from Parent!";
}
class ChildClass extends ParentClass {
public function displayMessage() {
// Can access protected property because of inheritance
return $this->message;
}
}
$obj = new ChildClass();
echo $obj->displayMessage(); // Output: Hello from Parent!
// This will cause an ERROR ❌
// echo $obj->message;
?>
📊 ملخص سريع للمقارنة
لكي لا تختلط عليك الأمور، إليك هذا الجدول البسيط:
| المحدد | الوصول من داخل الكلاس ✅ | الوصول من الكلاسات الوارثة ✅ | الوصول من خارج الكلاس (Object) ✅ |
|---|---|---|---|
| Public | نعم | نعم | نعم |
| Protected | نعم | نعم | لا |
| Private | نعم | لا | لا |
💡 متى أستخدم كل واحد منهم؟
- استخدم
publicعندما تريد جعل البيانات متاحة للجميع دون قيود. - استخدم
privateعندما تريد حماية بيانات حساسة جداً داخل الكلاس ومنع أي تلاعب خارجي بها (وهذا هو الأفضل في أغلب الأحيان لتحقيق مبدأ "التغليف" أو Encapsulation). - استخدم
protectedعندما تبني نظام كلاسات مترابطة وتريد أن تشارك بعض الخصائص مع الكلاسات الفرعية فقط.
ماذا سنتعلم في الدرس القادم؟ 🎓
الآن بعد أن عرفنا كيف نتحكم في الوصول إلى البيانات، سننتقل إلى موضوع ممتع وقوي جداً في البرمجة الكائنية وهو "الوراثة (Inheritance)"، حيث سنتعلم كيف نجعل كلاس يرث صفات كلاس آخر لتجنب تكرار الكود! انتظرنا في الدرس القادم. 👋
🎓 اختبر معلوماتك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال