خاصيات الكائنات في PHP

من موسوعة حسوب
< PHP

تطلق تسمية "الخاصيات properties" على المتغيّرات المعرّفة ضمن الأصناف، وهناك تسميات أخرى مثل "المعاملات" أو "الحقول"، ولكن سنستخدم التسمية الأولى "الخاصيات" في هذا الدليل. تعرّف الخاصيات باستخدام إحدى الكلمات المفتاحية public، أو protected، أو private تتبعها عبارة تصريح عن متغير اعتيادي. يمكن أن يتضمّن هذا التصريح عملية تهيئة initialization، ولكن يجب أن تكون هذه التهيئة ذات قيمة ثابتة، بمعنى أنّه يجب أن تكون قابلة للمعالجة في وقت التصريف ويجب أن لا تعتمد على المعلومات المتاحة في وقت التشغيل لغرض المعالجة.

راجع قابلية الرؤية للمزيد من المعلومات حول معاني الكلمات المفتاحية public، و protected، و private.

ملاحظة: لضمان توافق الشيفرة مع الإصدار الرابع من اللغة، يسمح الإصدار الخامس باستخدام الكلمة المفتاحية var في التصريح عن الخاصيات بدلًا من (أو إضافة إلى) public، أو protected، أو private. ولكن لا حاجة لاستخدام var في هذا الإصدار، وقد كانت تعدّ مهملة في الإصدارات 5.0 إلى 5.1.3 ويؤدي استخدامها إلى إطلاق تحذير من نوع E_STRICT، ولكن منذ الإصدار 5.1.3 لم تعد هذه الكلمة المفتاحية مهملة ولا يؤدي استخدامها إلى إطلاق أي تحذير.

إن صرّحت عن خاصّية ما باستخدام الكلمة المفتاحية var عوضًا عن استخدام public، أو protected، أو private، فإنّ الإصدار الخامس من اللغة سيعدّ أنّ التصريح هو من النوع public.

يمكن الوصول إلى الخاصيات غير الساكنة ضمن توابع الأصناف باستخدام <- (عامل الكائنات): ‎$this->property (تعني property هنا اسم الخاصية). أما الخاصيات الساكنة فيمكن الوصول إليها باستخدام :: (نقطتين رأسيتين مزدوجتين): self::$property. راجع الكلمة المفتاحية Static للمزيد من المعلومات حول الفرق بين الخاصيات الساكنة وغير الساكنة.

يكون المتغيّر الزائف ‎$this متوفّرًا في جميع توابع الأصناف عند استدعاء تلك الدالة ضمن الصنف نفسه. يعدّ ‎$this‎ مرجعًا للكائن المستدعي (عادة ما يكون الكائن الذي ينتمي إليه التابع، ولكن يمكن أن يكون كائنًا آخر، وذلك عندما يُستدعى التابع سكونيًّا [statically] ضمن كائن آخر).

المثال 1: التصريح عن الخاصّية

<?php
class SimpleClass
{
  // صحيح منذ الإصدار
  // PHP 5.6.0:
   public $var1 = 'hello ' . 'world';
   // صحيح منذ الإصدار
  // PHP 5.3.0:
   public $var2 = <<<EOD
hello world
EOD;
   // صحيح منذ الإصدار
  // PHP 5.6.0:
   public $var3 = 1+2;
  // طرق خاطئة في التصريح عن الخاصيات   
   public $var4 = self::myStaticMethod();
   public $var5 = $myVar;

  // طرق صحيحة في التصريح عن الخاصيات
   public $var6 = myConstant;
   public $var7 = array(true, false);

    // صحيح منذ الإصدار
  // PHP 5.3.0:
   public $var8 = <<<'EOD'
hello world
EOD;
}
?>

منذ الإصدار 5.3 من PHP أصبح بالإمكان استخدام صيغة heredocs و nowdocs في أي سياق ساكن للمعلومات (static data context) ومن ضمنها التصريح عن الخاصيات.

المثال 2: مثال عن استخدام صيغة nowdoc لتهيئة الخاصية

<?php
class foo {
// منذ الإصدار
// PHP 5.3.0
   public $bar = <<<'EOT'
bar
EOT;
   public $baz = <<<EOT
baz
EOT;
}
?>

ملاحظة: أصبحت صيغتا Nowdocs و Heredocs متاحين منذ الإصدار 5.3.0 من اللغة.

مصادر