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

دوال Getters و Setters

جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 40 من 91.

الآن بعد أن فهمت معدلات الوصول (access modifiers)، كيف يمكنك التفاعل بأمان مع الخصائص الخاصة (private properties) من خارج الفئة (class)؟ الإجابة هي getters و setters - وهي دوال عامة (public methods) توفر وصولاً متحكماً فيه للبيانات الخاصة.

يقوم الـ 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) التحكم في كيفية الوصول إلى البيانات الخاصة وتعديلها، مما يسمح بالتحقق من الصحة، أو التنسيق، أو أي منطق مخصص.

challenge icon

التحدي

سهل

لنقم ببناء نظام مخزون منتجات يستخدم دوال الجلب (getters) ودوال التعيين (setters) لحماية بيانات المنتج والتحقق من صحتها. ستقوم بإنشاء فئة Product تضمن أن الأسعار موجبة دائماً وأن كميات المخزون ليست سالبة أبداً — مما يوضح كيف يمكن لدوال التعيين فرض قواعد العمل.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • Product.php — أنشئ فئة Product بثلاث خصائص خاصة (private): $name (سلسلة نصية)، $price (رقم عشري)، و $stock (عدد صحيح). قم بتنفيذ دوال الجلب والتعيين لكل خاصية مع قواعد التحقق التالية:
    • يجب أن تقبل setName() السلاسل النصية غير الفارغة فقط — إذا كانت السلسلة فارغة بعد إزالة المسافات (trimming)، فلا تقم بتحديث الخاصية.
    • يجب أن تقبل setPrice() القيم الأكبر من 0 فقط — ارفض الأسعار الصفرية أو السالبة.
    • يجب أن تقبل setStock() القيم التي تساوي 0 أو أكبر — ارفض كميات المخزون السالبة.
    يجب أن تقوم كل دالة جلب ببساطة بإرجاع قيمة الخاصية المقابلة. أضف دالة عامة (public) باسم getInfo() ترجع "[name]: $[price] ([stock] in stock)" مع تنسيق السعر إلى منزلتين عشريتين.
  • main.php — قم بتضمين ملف Product. ستتلقى أربعة مدخلات: اسم المنتج، السعر، كمية المخزون، وسعر جديد للتحديث. أنشئ كائناً (instance) من Product واستخدم دوال التعيين لتعيين الاسم الأولي، والسعر (محولاً إلى float)، والمخزون (محولاً إلى integer). اطبع نتيجة getInfo(). ثم حاول تحديث السعر بقيمة السعر الجديد (محولاً إلى float) واطبع getInfo() مرة أخرى. أخيراً، حاول تعيين المخزون إلى -5 (قيمة غير صالحة) واطبع getInfo() مرة أخيرة للتأكد من عدم تغيير المخزون.

تعمل دوال التعيين الخاصة بك كحراس — فهي تتحقق من صحة البيانات الواردة قبل السماح بإجراء تغييرات على الخصائص الخاصة. عندما يتم تمرير بيانات غير صالحة (مثل مخزون سالب)، تتجاهلها دالة التعيين ببساطة، مما يحافظ على القيمة الصالحة الموجودة. هذه هي قوة الكبسلة (encapsulation): يحافظ الكائن الخاص بك على سلامته بغض النظر عما يحاول الكود الخارجي فعله.

جرّب بنفسك

<?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) لتحديد name الأولي، و price (كـ float)، و stock (كـ integer)

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

// TODO: تحديث السعر بـ newPrice (كـ float) وطباعة getInfo() مرة أخرى

// TODO: محاولة تعيين stock إلى -5 (غير صالح) وطباعة getInfo() للتأكد من عدم تغيير المخزون

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

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

جميع دروس Object Oriented Programming