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

الأصناف والكائنات في PHP: الخصائص والتوابع و$this

الصنف في PHP مخطط يُعرَّف بـ class Name { }، وتنشئ new Name() كائنًا منه. تعلّم الخصائص، والتوابع، و$this، وpublic/private/protected، والخصائص ذات الأنواع وreadonly، و__toString، ولماذا لا ينسخ إسنادُ كائنٍ الكائن.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

يُعرَّف الصنف في PHP بـ class Name { ... } ويحمل خصائص (متغيرات) وتوابع (دوال). تنشئ new Name() كائنًا منه، ويقرأ -> خاصية أو يستدعي تابعًا: $user->name و$user->greet().

الصنف هو المخطط، والكائن شيء واحد مبني منه. يمكنك إنشاء ما تحتاجه من كائنات من صنف واحد، ولكل منها قيم خصائصه الخاصة.

الخصائص والتوابع

تُعرَّف الخاصية بكلمة رؤية، ونوع اختياري، وقيمة افتراضية اختيارية. والتابع دالة داخل الصنف. داخل التابع، $this هو الكائن الذي استُدعي عليه التابع، فتقرأ $this->balance رصيد ذلك الكائن.

يحتفظ كل كائن بـ $balance الخاص به: الإيداع في $a لا يمس $b. وضبط الخصائص واحدة واحدة بعد new ممل؛ أما الباني فيأخذ القيم الابتدائية وسائط بدلًا من ذلك.

public وprivate وprotected

تتحكم الرؤية فيمن يستطيع لمس خاصية أو استدعاء تابع:

الكلمةيمكن الوصول إليه من
publicأي مكان
protectedالصنف نفسه والأصناف التي ترثه
privateالصنف الذي يعرّفه فقط

جعل الخاصية private وكشف التوابع هو طريقة الصنف لحماية قواعده. هنا لا يتغير الرصيد إلا عبر deposit() وwithdraw()، اللتين ترفضان المبالغ الخاطئة:

قراءة الخاصية الخاصة من خارج الصنف ليست تحذيرًا، بل Error:

الخصائص ذات الأنواع والقيم غير المهيأة

تبدأ الخاصية ذات النوع دون قيمة افتراضية غير مهيأة، وهذا يختلف عن null. وقراءتها قبل إسناد أي شيء إليها ترمي Error. إما أن تعطيها قيمة افتراضية، أو تسندها في الباني، أو تجعلها قابلة لـ null بـ ?Type و= null.

تُفرض الأنواع عند الإسناد. في الوضع الافتراضي (غير الصارم)، تحوّل $p->stock = '7' النص الرقمي إلى 7، بينما ترمي $p->stock = 'many' الخطأ TypeError.

الخصائص readonly

تُكتب الخاصية readonly (PHP 8.1) مرة واحدة، من داخل الصنف، ثم لا تُكتب أبدًا. وهي الطريقة المعتادة لبناء كائنات القيم مثل المبالغ المالية أو المعرّفات. وأضافت PHP 8.2 الصيغة readonly class، التي تجعل كل خاصية readonly.

يجب أن يكون للخاصية readonly نوع، ولا يمكن أن تكون لها قيمة افتراضية. إذا احتجت إلى نسخة معدّلة، فأنشئ كائنًا جديدًا (new Order('B-2002')) بدل تعديل القديم.

طباعة كائن بـ __toString

لا تعمل echo $object إلا عندما يعرّف الصنف __toString(). يعيد التابع النص الذي يجب أن تستخدمه PHP كلما عومل الكائن على أنه نص: في echo، وفي ضم النصوص، وفي "{$object}".

دون __toString، ترمي echo $object الخطأ Error ("Object of class Money could not be converted to string"). ولتصحيح الأخطاء، تعمل print_r() وvar_dump() على أي كائن وتعرضان الخصائص الخاصة أيضًا؛ راجع var_dump وprint_r.

إسناد كائن لا ينسخه

هذا هو الخطأ الذي يوقع معظم القادمين من المصفوفات. إسناد مصفوفة ينسخها. أما إسناد كائن فلا ينسخ إلا المقبض: يشير المتغيران بعدها إلى الكائن نفسه.

تصنع clone نسخة سطحية: إذا كانت خاصية تحمل كائنًا آخر، فإن النسختين ما زالتا تتشاركان ذلك الكائن الداخلي. تكون === صحيحة فقط للكائن نفسه، بينما تقارن == قيم خصائص كائنين من الصنف نفسه. وتمرير كائن إلى دالة يعمل بطريقة الإسناد نفسها، لذا تستطيع الدالة تغيير الكائن الذي تتلقاه.

الأسئلة الشائعة

كيف أنشئ كائنًا من صنف في PHP؟

استخدم new مع اسم الصنف: $user = new User();. إذا كان للصنف باني، فمرّر وسائطه بين القوسين، كما في new User('Ada'). ثم تستدعي التوابع وتقرأ الخصائص بعامل السهم: $user->name و$user->greet().

ماذا تعني $this في PHP؟

$this هو الكائن الذي استُدعي عليه التابع الحالي. داخل $ada->greet() تكون $this هي $ada، فتقرأ $this->name اسم Ada. ولا توجد إلا داخل التوابع غير الساكنة.

ما الفرق بين public وprivate وprotected في PHP؟

يمكن استخدام الأعضاء public من أي مكان، والأعضاء private من داخل الصنف الذي يعرّفها فقط، والأعضاء protected من ذلك الصنف وأصنافه الفرعية. وقراءة خاصية خاصة من الخارج ترمي Error: Cannot access private property.

هل تُمرَّر الكائنات بالمرجع في PHP؟

يحمل المتغير مقبضًا إلى الكائن، لا الكائن نفسه. تنسخ $b = $a; المقبض، فيشير المتغيران إلى الكائن نفسه ويظهر التغيير عبر $b في $a. استخدم $b = clone $a; لتحصل على نسخة مستقلة.

ما هي الخاصية readonly في PHP؟

الخاصية المصرّح بها public readonly string $id; (PHP 8.1 وما بعدها) يمكن ضبطها مرة واحدة، من داخل الصنف، ولا تتغير بعد ذلك أبدًا. والكتابة فيها مرة ثانية ترمي Error: Cannot modify readonly property.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن