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

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

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): يحافظ الكائن الخاص بك على سلامته بغض النظر عما يحاول الكود الخارجي فعله.

ورقة مرجعية

استخدم 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() للتأكد من عدم تغيير المخزون

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

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

جميع دروس Object Oriented Programming