ثوابت الأصناف في PHP

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

يمكن تعريف قيم ثابتة لا يمكن تعديلها ولكل صنفٍ على حدة. تختلف الثوابت عن المتغيرات الاعتيادية في عدم استخدام العلامة $ للتصريح عنها أو استخدامها. تمتلك ثوابت الأصناف قابلية رؤية من نوع public.

يجب أن تكون القيمة تعبيرًا ثابتًا وليس (على سبيل المثال) متغيرًا أو خاصّية أو استدعاء دالة.

يمكن للواجهات interfaces أن تمتلك ثوابت أيضًا. راجع التوثيق الخاص بالواجهات لمشاهدة الأمثلة.

منذ الإصدار 5.3.0، أصبح بالإمكان استخدام المتغيرات للإشارة إلى الصنف، ولا يمكن أن يحمل المتغير قيمة تمثّل إحدى الكلمات المفتاحية (مثل: self، و parent، و static).

لاحظ أن تحديد ثوابت الأصناف يكون لكل صنف على حدة، وليس لكل نسخة من الصنف.

المثال 1: تعريف الثوابت واستخدامها

<?php
class MyClass
{
    const CONSTANT = 'constant value';

    function showConstant() {
        echo  self::CONSTANT . "\n";
    }
}

echo MyClass::CONSTANT . "\n";

$classname = "MyClass";
echo $classname::CONSTANT . "\n";
// منذ الإصدار 5.3.0

$class = new MyClass();
$class->showConstant();

echo $class::CONSTANT."\n";
// منذ الإصدار 5.3.0
?>

المثال 2: أمثلة على بيانات ساكنة

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

ملاحظة: يمكن استخدام صيغة Heredoc و Nowdoc لتهيئة الثوابت في الإصدار 5.3.0 وما بعده من اللغة.

أصبح الثابت الخاص ‎::class‎ متوفّرًا في الإصدار 5.5.0 من اللغة، ويتيح الحصول على الاسم المؤهّل بالكامل للصنف (fully qualified class name) في وقت التصريف، وهو مفيد عند التعامل مع الأصناف الموجودة في مجالات أسماء مختلفة.

المثال 3: استخدام ‎::class مع صنف موجود في مجال أسماء

<?php
namespace foo {
    class bar {
    }

    echo bar::class; // foo\bar
}
?>

المثال 4: مثال عن تعبير constant

<?php
const ONE = 1;

class foo {
    // منذ الإصدار 5.6.0
    const TWO = ONE * 2;
    const THREE = ONE + self::TWO;
    const SENTENCE = 'The value of THREE is '.self::THREE;
}
?>

يمكن تقديم تعبير أوّل يتضمن أعدادًا أو حروفًا و/أو ثوابت في السياق الخاص بثابت الصنف.

ملاحظة: أصبح تعبير constant متوفّرًا في الإصدار 5.6.0 من اللغة.

المثال 5: استخدام معدِّلات الظهور مع ثابت الصنف

<?php
class Foo {
    // منذ الإصدار 7.1.0
    public const BAR = 'bar';
    private const BAZ = 'baz';
}
echo Foo::BAR, PHP_EOL;
echo Foo::BAZ, PHP_EOL;
?>

تعطي الشيفرة السابقة المخرجات التالية في الإصدار 7.1:

bar

Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in 

ملاحظة: يمكن استخدام معدِّلات الرؤية مع ثوابت الأصناف في الإصدار 7.1.0 وما بعده من اللغة.

مصادر