انتقل إلى محتوى الدرس

Handling Dynamic Calls with __get and __call التعامل مع الخصائص والدوال الديناميكية بـ __get و __call

خصّص سلوك الكائنات في PHP 8 عبر الدوال السحرية __toString و__invoke و__clone، وافهم النسخ السطحي والعميق ومقارنة الكائنات.
1 صفوف تعليمية
PHP
0 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

يستدعي PHP الدالة __get($name) عند محاولة قراءة خاصية غير موجودة أو غير متاحة، ويستدعي __call($name, $args) عند استدعاء دالة غير معرفة في الكائن.

  • ترتبط بـ __get دوال مكملة مثل __set($name, $value) عند الكتابة و__isset($name) عند الفحص بـ isset().
  • في PHP 8.2+، أصبحت إضافة خصائص ديناميكية غير معلنة للكائنات العادية مهملة (Deprecated)؛ لذا استخدم مصفوفة داخلية خاصة مع __get() عند الحاجة.
  • فضّل دائماً الخصائص والدوال الصريحة ذات الأنواع المحددة عندما تكون الهيكلة معروفة مسبقاً لدعم الإكمال التلقائي في المحررات.

قراءة $cfg->env تستدعي __get("env")، واستدعاء $cfg->refresh("cache") يمرر الاسم والمعاملات إلى __call().

PHP
<?php
class ConfigBag {
    public function __construct(private array $items) {}
    public function __get(string $key): mixed {
        return $this->items[$key] ?? "default";
    }
    public function __call(string $method, array $args): string {
        return "Handled {$method}(" . implode(",", $args) . ")";
    }
}
$cfg = new ConfigBag(["env" => "production"]);
echo $cfg->env . " | " . $cfg->refresh("cache") . "\n";