تكرار السؤال: …
الإجابة المختصرة
تشير self إلى الفئة التي كُتب فيها الكود أثناء زمن الترجمة، بينما تشير static إلى الفئة التي تم استدعاء الدالة منها فعلياً وقت التشغيل.
الشرح
في الوراثة، إذا كانت الفئة الأب تحتوي على دالة static تنشئ نسخة جديدة عبر new self()، وقامت فئة ابن باستدعاء الدالة، ستنشئ self نسخة من الأب دائماً. إدخال مفهوم Late Static Binding عبر new static() يوجه المحرك لحل الفئة بناءً على الفئة المستدعية وقت التشغيل، وهو الأساس المعتمد في نمط Model::create() بـ Laravel.
مثال بالكود
class Model {
public static function make() {
return new static(); // ينشئ نسخة من الفئة الفرعية المستدعية
}
}
class User extends Model {}
User::make(); // ينشئ User وليس Modelأخطاء شائعة
- استخدام self::class في مصانع الفئات الموروثة مما يعيد اسم الفئة الأساسية دائماً.