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

__get, __set, __isset, __unset

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

يوفّر PHP أربع magic methods تعترض الوصول إلى الخصائص: __get() و__set() و__isset() و__unset(). ويتم تشغيلها عند محاولة الوصول إلى خصائص لا exist أو يتعذّر الوصول إليها.

يتم استدعاء __get() method عند قراءة property غير قابلة للوصول، بينما يتولى __set() معالجة الكتابة إليها. يتيح لك ذلك إنشاء properties ديناميكية أو إضافة منطق عند الوصول إلى properties:

<?php
class DynamicObject {
    private array $data = [];
    
    public function __get(string $name): mixed {
        return $this->data[$name] ?? null;
    }
    
    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }
}

$obj = new DynamicObject();
$obj->title = "Hello";
$obj->count = 42;
echo $obj->title . " - " . $obj->count;

الناتج:

Hello - 42

يتم تشغيل الطريقة __isset() بواسطة isset() أو empty()، وتستجيب __unset() للدالة unset():

<?php
class DynamicObject {
    private array $data = [];
    
    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }
    
    public function __isset(string $name): bool {
        return isset($this->data[$name]);
    }
    
    public function __unset(string $name): void {
        unset($this->data[$name]);
    }
}

$obj = new DynamicObject();
$obj->name = "Test";
echo isset($obj->name) ? "exists" : "missing";

المخرجات:

REQUIRED OUTPUT FORMAT: [Your translated content here]
exists

تُستخدم هذه الأساليب عادةً لإنشاء حاويات بيانات مرنة، أو تنفيذ التحميل الكسول، أو بناء كائنات تتصرف مثل المصفوفات مع الحفاظ على بنية موجهة للكائنات.

challenge icon

التحدي

سهل

لنبنِ مدير configuration مرنًا يخزّن الإعدادات ديناميكيًا باستخدام magic methods. ستعترض class الخاصة بك على الوصول إلى الخصائص لإدارة قيم configuration، والتحقق مما إذا كانت الإعدادات exists، وإزالتها عند الحاجة، وكل ذلك دون تعريف كل خاصية بشكل صريح.

ستنظّم كودك عبر ملفين:

  • Config.php: أنشئ class باسم Config تستخدم private array لتخزين قيم configuration داخليًا. Implement جميع property magic methods الأربعة:
    • __get($name): تُرجع القيمة الخاصة بـ given key، أو "undefined" إذا كان key لا exist
    • __set($name, $value): تخزّن القيمة تحت given key
    • __isset($name): تُرجع ما إذا كان key exists في configuration
    • __unset($name): تزيل key من configuration
    أضف أيضًا method باسم count() تُرجع number من الإعدادات المخزّنة.
  • main.php: ضمّن ملف Config. ستتلقى ثلاثة inputs: اسم إعداد، وقيمة إعداد، واسم إعداد ثانٍ. أنشئ Config instance ونفّذ العمليات التالية:
    • اضبط الإعداد الأول على given value
    • اطبع ما إذا كان الإعداد الأول exists باستخدام isset(): أخرج "exists" أو "missing"
    • اطبع قيمة الإعداد الأول
    • اطبع count الحالي للإعدادات
    • استخدم unset() لإزالة الإعداد الأول
    • اطبع ما إذا كان الإعداد الأول exists الآن: أخرج "exists" أو "missing"
    • اطبع قيمة الإعداد الثاني، الذي لم يتم ضبطه never

يجب أن يكون كل output في سطر مستقل. تتيح لك magic methods التفاعل مع كائن Config باستخدام صياغة الخصائص الطبيعية مثل $config->theme = "dark" وisset($config->theme)، رغم عدم تعريف أي خصائص فعلية.

جرّب بنفسك

<?php

require_once 'Config.php';

// اقرأ المدخلات
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));

// TODO: أنشئ مثيلاً من Config

// TODO: عيّن الإعداد الأول إلى القيمة المعطاة

// TODO: اطبع ما إذا كان الإعداد الأول موجودًا ("exists" أو "missing")

// TODO: اطبع قيمة الإعداد الأول

// TODO: اطبع العدد الحالي للإعدادات

// TODO: استخدم unset() لإزالة الإعداد الأول

// TODO: اطبع ما إذا كان الإعداد الأول موجودًا الآن ("exists" أو "missing")

// TODO: اطبع قيمة الإعداد الثاني (الذي لم يتم تعيينه أبدًا)

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

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

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

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