__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:existsتُستخدم هذه الأساليب عادةً لإنشاء حاويات بيانات مرنة، أو تنفيذ التحميل الكسول، أو بناء كائنات تتصرف مثل المصفوفات مع الحفاظ على بنية موجهة للكائنات.
التحدي
سهللنبنِ مدير 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
count()تُرجع number من الإعدادات المخزّنة.main.php: ضمّن ملف Config. ستتلقى ثلاثة inputs: اسم إعداد، وقيمة إعداد، واسم إعداد ثانٍ. أنشئConfiginstance ونفّذ العمليات التالية:- اضبط الإعداد الأول على 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: اطبع قيمة الإعداد الثاني (الذي لم يتم تعيينه أبدًا)
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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)تدرّب بنفسك: مترجم PHP عبر الإنترنت