دوال Getters و Setters
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 40 من 91.
الآن بعد أن فهمت معدلات الوصول، كيف تتفاعل بأمان مع الخصائص الخاصة من خارج الفئة؟ الإجابة هي getters و setters - وهي دوال عامة توفر وصولاً متحكماً فيه للبيانات الخاصة.
يقوم الـ getter باسترداد قيمة الخاصية، بينما يقوم الـ setter بتعديلها. يتيح لك هذا النمط إضافة التحقق من الصحة أو المنطق البرمجي عند الوصول إلى البيانات أو تغييرها:
<?php
class User {
private string $email;
private int $age;
public function getEmail(): string {
return $this->email;
}
public function setEmail(string $email): void {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
}
}
public function getAge(): int {
return $this->age;
}
public function setAge(int $age): void {
if ($age >= 0 && $age <= 150) {
$this->age = $age;
}
}
}
$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);
echo $user->getEmail() . "\n";
echo $user->getAge();
المخرجات:
john@example.com
25يقوم الـ setter بالتحقق من صحة تنسيق البريد الإلكتروني ويضمن أن العمر منطقي قبل تخزين القيم. بدون الـ setters، يمكن لأي شخص تعيين بيانات غير صالحة مباشرة. يمكنك أيضاً إنشاء خصائص للقراءة فقط من خلال توفير getter فقط، أو خصائص للكتابة فقط مع setter فقط.
نقطة رئيسية: تمنحك دوال الجلب (Getters) والتعيين (Setters) التحكم في كيفية الوصول إلى البيانات الخاصة وتعديلها، مما يسمح بالتحقق من الصحة، أو التنسيق، أو أي منطق مخصص.
التحدي
سهللنقم ببناء نظام مخزون منتجات يستخدم دوال الجلب (getters) ودوال التعيين (setters) لحماية بيانات المنتج والتحقق من صحتها. ستقوم بإنشاء فئة Product تضمن أن الأسعار دائماً موجبة وكميات المخزون ليست سالبة أبداً — مما يوضح كيف يمكن لدوال التعيين فرض قواعد العمل.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
Product.php— أنشئ فئةProductبثلاث خصائص خاصة (private):$name(سلسلة نصية)، و$price(رقم عشري)، و$stock(عدد صحيح). قم بتنفيذ دوال الجلب والتعيين لكل خاصية مع قواعد التحقق التالية:- يجب أن تقبل
setName()فقط السلاسل النصية غير الفارغة — إذا كانت السلسلة فارغة بعد إزالة المسافات (trimming)، فلا تقم بتحديث الخاصية. - يجب أن تقبل
setPrice()فقط القيم الأكبر من 0 — ارفض الأسعار الصفرية أو السالبة. - يجب أن تقبل
setStock()فقط القيم التي تساوي 0 أو أكبر — ارفض كميات المخزون السالبة.
getInfo()ترجع"[name]: $[price] ([stock] in stock)"مع تنسيق السعر إلى منزلتين عشريتين.- يجب أن تقبل
main.php— قم بتضمين ملف Product. ستتلقى أربعة مدخلات: اسم المنتج، السعر، كمية المخزون، وسعر جديد للتحديث. أنشئ كائناً (instance) منProductواستخدم دوال التعيين لتعيين الاسم الأولي، والسعر (محولاً إلى float)، والمخزون (محولاً إلى integer). اطبع نتيجةgetInfo(). ثم حاول تحديث السعر بقيمة السعر الجديد (محولاً إلى float) واطبعgetInfo()مرة أخرى. أخيراً، حاول تعيين المخزون إلى-5(قيمة غير صالحة) واطبعgetInfo()مرة أخيرة للتأكد من أن المخزون لم يتغير.
تعمل دوال التعيين الخاصة بك كحراس بوابات — فهي تتحقق من صحة البيانات الواردة قبل السماح بإجراء تغييرات على الخصائص الخاصة. عندما يتم تمرير بيانات غير صالحة (مثل مخزون سالب)، تتجاهلها دالة التعيين ببساطة، مما يحافظ على القيمة الصالحة الموجودة كما هي. هذه هي قوة الكبسلة (encapsulation): يحافظ الكائن الخاص بك على سلامته بغض النظر عما يحاول الكود الخارجي فعله.
ورقة مرجعية
استخدم getters and setters (دوال الجلب والتعيين) لتوفير وصول متحكم به إلى الخصائص الخاصة (private properties). تقوم دالة الجلب (getter) باسترداد القيمة، بينما تقوم دالة التعيين (setter) بتعديلها مع إمكانية التحقق من صحتها:
<?php
class User {
private string $email;
private int $age;
public function getEmail(): string {
return $this->email;
}
public function setEmail(string $email): void {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
}
}
public function getAge(): int {
return $this->age;
}
public function setAge(int $age): void {
if ($age >= 0 && $age <= 150) {
$this->age = $age;
}
}
}
$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);
echo $user->getEmail(); // john@example.com
echo $user->getAge(); // 25
يمكن لدوال التعيين (Setters) التحقق من صحة البيانات قبل تخزينها. إذا فشل التحقق، يمكن لدالة التعيين تجاهل التحديث، مما يحافظ على القيمة الموجودة كما هي. يمكنك إنشاء خصائص للقراءة فقط من خلال توفير دالة جلب (getter) فقط، أو خصائص للكتابة فقط من خلال توفير دالة تعيين (setter) فقط.
جرّب بنفسك
<?php
require_once 'Product.php';
// قراءة المدخلات
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));
// TODO: إنشاء مثيل (instance) جديد من الكلاس Product
// TODO: استخدام دوال الـ setters لتعيين الاسم الابتدائي، والسعر (كعدد عشري float)، والمخزون (كعدد صحيح integer)
// TODO: طباعة نتيجة getInfo()
// TODO: تحديث السعر بالقيمة newPrice (كعدد عشري float) وطباعة getInfo() مرة أخرى
// TODO: محاولة تعيين المخزون إلى -5 (غير صالح) وطباعة getInfo() للتأكد من عدم تغيير المخزون
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
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)