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

دوال Getters و Setters

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

الآن بعد أن فهمتَ محددات الوصول، كيف تتفاعل بأمان مع الخصائص private من خارج الفئة؟ الإجابة هي getters و setters - وهي أساليب public توفّر وصولًا متحكَّمًا فيه إلى البيانات الخاصة.

يسترجع 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 من تنسيق email وتتأكد من أن age معقول قبل تخزين القيم. من دون دوال setter، يمكن لأي شخص إسناد بيانات غير صالحة مباشرةً. يمكنك أيضًا إنشاء خصائص للقراءة فقط من خلال توفير getter فقط، أو خصائص للكتابة فقط باستخدام setter فقط.

النقطة الأساسية: تمنحك دوال getter وsetter التحكم في كيفية الوصول إلى البيانات الخاصة وتعديلها، مما يتيح إجراء التحقق أو التنسيق أو أي منطق مخصص.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لجرد المنتجات يستخدم getter وsetter لحماية بيانات المنتج والتحقق من صحتها. ستنشئ فئة Product تضمن أن تكون الأسعار موجبة دائمًا وأن كميات المخزون غير سالبة أبدًا، موضحًا كيف يمكن لـ setter فرض قواعد العمل.

ستنظم التعليمات البرمجية عبر ملفين:

  • Product.php: أنشئ فئة Product تحتوي على ثلاث خصائص private: $name (سلسلة نصية)، $price (float)، و$stock (integer). Implement getter وsetter لكل خاصية وفق قواعد التحقق التالية:
    • يجب أن يقبل setName() سلاسل نصية non فارغة فقط؛ وإذا كانت السلسلة فارغة بعد إزالة المسافات الزائدة، فلا تحدّث الخاصية
    • يجب أن يقبل setPrice() القيم greater من 0 فقط: ارفض الأسعار الصفرية أو السالبة
    • يجب أن يقبل setStock() القيم التي تساوي 0 أو greater فقط: ارفض كميات المخزون السالبة
    يجب أن يعيد كل getter ببساطة قيمة الخاصية المقابلة. أضف method عامًا getInfo() يعيد "[name]: $[price] ([stock] in stock)" مع تنسيق السعر إلى منزلتين عشريتين.
  • main.php: أدرج ملف Product. ستتلقى أربعة inputs: اسم منتج، وسعرًا، وكمية مخزون، وسعرًا جديدًا للتحديث. أنشئ instance من Product واستخدم setter لتعيين الاسم initial والسعر (بعد تحويله إلى float) والمخزون (بعد تحويله إلى integer). Print نتيجة getInfo(). ثم حاول تحديث السعر باستخدام قيمة السعر الجديد (بعد تحويلها إلى float)، واطبع getInfo() مرة أخرى. وأخيرًا، حاول تعيين المخزون إلى -5 (قيمة invalid)، واطبع getInfo() مرة أخرى للتأكد من أن المخزون لم يتغير.

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

جرّب بنفسك

<?php
require_once 'Product.php';

// اقرأ المدخلات
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));

// TODO: أنشئ كائن Product جديد

// TODO: استخدم الـ setters لتعيين name الأولي وprice (كـ float) وstock (كـ integer)

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

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

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

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

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

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

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