المتغيرات المتغيرة في PHP

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

قد تحتاج في بعض الأحيان إلى استخدام أسماء متغيّرة للمتغيرات، بمعنى أن تعيين اسم المتغيّر واستخدامه يكون بصورة ديناميكية. لتعريف المتغيرات العادية نستخدم الصيغة التالية:

<?php
$a = 'hello';
?>

أما المتغيّر المتغير (variable variable) فيأخذ قيمة متغيّر معين ويستخدمه كاسم لمتغير آخر. في المثال السابق يمكن استخدام الكلمة hello كاسم لمتغير آخر وذلك باستخدام علامتي $ عند التعبير عن المتغير:

<?php
$$a = 'world';
?>

في هذه النقطة هناك متغيّران معرّفان ومخزنان في شجرة رموز PHP (أي PHP symbol tree): الأول هو ‎$a وقيمته "hello" والثاني هو ‎$hello وقيمته "world". وهكذا تكون مخرجات العبارة التالية:

<?php
echo "$a ${$a}";
?>

مشابهة تمامًا لمخرجات العبارة:

<?php
echo "$a $hello";
?>

بمعنى أنّ النتيجة هي: hello world.

يمكن استخدام المتغيرات المتغيرة مع المصفوفات، ولكن سيحصل التباس في هذه الحالة، فعند كتابة ‎$$a[1]‎ يجب على مفسّر اللغة معرفة ما إذا كان المقصود هو استخدام ‎$a[1]‎ كمتغير، أو أن المطلوب هو استخدام ‎$$a كمتغير ثم [1] كفهرس (مفتاح) لذلك المتغير. ولرفع هذا الالتباس تكون صيغة التعبير للحالة الأولى هي ‎${$a[1]}‎، وللحالة الثانية ‎${$a}[1]‎.

يمكن الوصول إلى خصائص الأصناف بواسطة أسماء خصائص متغيرة (variable property names). وسيحلّل اسم الخاصية المتغير ضمن النطاق الذي حصل فيه الاستدعاء. على سبيل المثال، عند استخدام تعبير مثل ‎$foo->$bar يجرى فحص النطاق المحلي بحثًا عن المتغير ‎$bar وستُستخدم قيمته كاسم للخاصية ‎$foo. ما سبق ينطبق كذلك في حال كون ‎$bar معامل وصول إلى مصفوفة.

تنبيه: في حال كون الخاصّية المتغيّرة على هيئة مصفوفة فإن الاستمرار في إلغاء مرجعيتها يتطلب استخدام صيغ مختلفة بين الإصدارين الخامس والسابع من PHP. يتضمن دليل الانتقال إلى الإصدار 7.0 من PHP تفاصيل إضافية عن التغييرات الحاصلة على التعبيرات، وكيفية استخدام الأقواس المعقوفة ({}) لرفع الالتباس.

يمكن استخدام الأقواس المعقوفة لتعيين حدود اسم الخاصية. وتتجلّى فائدة الأقواس المعقوفة عند الحاجة للوصول إلى قيم تابعة لخاصية تحتوي على مصفوفة، أو عندما يتكوّن اسم الخاصّية من أجزاء متعددة، أو عندما يتضمن اسم الخاصية أحرفًا غير مسموح بها في سياقات أخرى (مثال: من json_decode() أو SimpleXML).

المثال 1: مثال على خاصّية متغيرة

<?php
class foo {
    var $bar = 'I am bar.';
    var $arr = array('I am A.', 'I am B.', 'I am C.');
    var $r   = 'I am r.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n";
echo $foo->{$baz[1]} . "\n";

$start = 'b';
$end   = 'ar';
echo $foo->{$start . $end} . "\n";

$arr = 'arr';
echo $foo->{$arr[1]} . "\n";

?>

مخرجات المثال السابق هي:

I am bar.
I am bar.
I am bar.
I am r.

تحذير: يرجى الانتباه إلى عدم إمكانية استخدام المتغيرات المتغيرة في المصفوفات ذوات النطاق العام العالي (superglobal arrays) ضمن الدوال أو توابع الأصناف. كذلك الأمر بالنسبة للمتغيّر ‎$this، فهو متغيّر خاص ولا يمكن الإشارة إليه ديناميكيًا.

مصادر