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

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

يكون التعبير عن المتغيرات في PHP باستخدام علامة $ متبوعة باسم المتغير والذي يكون حساسًا لحالة الأحرف.

تتبع المتغيرات نفس القواعد المتبّعة للتسمية في PHP. إذ يبدأ اسم المتغير الصحيح بحرف أو بشرطة سفلية متبوعة بعدد غير محدد من الحروف أو الأرقام أو الشرطات السفلية. ولو أردنا استخدام التعابير النمطية (Regular Expression) للتعبير عن اسم المتغير فسيكون كالتالي: '‎‎[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*‎‎'.

ملاحظة: في هذا الدليل الحرف هو كل ما يقع ضمن النطاق a-z و A-Z والبايتات من 127 إلى 255 (0x7f-0xff).

ملاحظة: المتغير ‎$this هو متغيّر خاص ولا يمكن استخدامه في تسمية المتغيرات.

نصيحة: راجع دليل Userland للتسمية.

للمزيد من المعلومات حول التوابع المرتبطة بالمتغيرات، راجع قسم دوال المتغيرات.

<?php
$var = 'Bob';
$Var = 'Joe';
echo "$var, $Var";      // المخرجات: "Bob, Joe"

$4site = 'not yet';     // غير صحيح، يبدأ الاسم برقم
$_4site = 'not yet';    // صحيح، يبدأ الاسم بشرطة سفلية
$täyte = 'mansikka';    // صحيح، فالحرف 'ä' ضمن الترميز ASCII 228 الموسّع.
?>

يكون إسناد المتغيّرات بواسطة القيمة دائمًا، بمعنى أنّه عند إسناد تعبير إلى متغيّر ما فإن قيمة هذا التعبير تُنسخ برمّتها إلى ذلك المتغير. وهذا يعني مثلًا أنّه بعد إسناد قيمة متغيّر معيّن إلى متغير آخر، فإن تعديل قيمة أحد هذين المتغيرين لن يؤثر إطلاقًا على الآخر. للمزيد من المعلومات حول هذا النوع من الإسناد يمكنك مراجعة فصل التعابير.

تقدّم PHP طريقة أخرى لإسناد القيم إلى المتغيرات، وهي الإسناد بالمرجعية (assign by reference)، وهذا يعني أن المتغير الجديد هو ببساطة مرجع (وبعبارة أخرى "يصبح مختصرًا لـ" أو "يشير إلى") للمتغيّر الأصلي، وبالتالي سيؤدي تعديل قيمة المتغير الجديد إلى التأثير على المتغيّر الأصلي، والعكس صحيح كذلك.

ولإسناد المتغير بالمرجعية يمكن إضافة العلامة & إلى بداية اسم المتغير الذي سيُسنَد (المتغير المصدري). فعلى سبيل المثال مخرجات الشيفرة التالية هي العبارة 'My name is Bob' مكرّرةً مرتين:

<?php
$foo = 'Bob';
$foo = 'Bob';              // إسناد القيمة 'Bob' إلى $foo
$bar = &$foo;              // الإشارة إلى $foo بواسطة $bar.
$bar = "My name is $bar";  // تغيير قيمة $bar...
echo $bar;
echo $foo;                 // قيمة $foo تغيّرت كذلك.
?>
من المهمّ الانتباه إلى أنّه يمكن الإسناد بالإشارة إلى المتغيّرات المسمّاة فقط.

<?php
$foo = 25;
$bar = &$foo;      // طريقة الإسناد صحيحة.
$bar = &(24 * 7);  // طريقة خاطئة، فالإسناد أُجري على تعبيرٍ لا يحمل اسمًا.

function test()
{
   return 25;
}

$bar = &test();    // غير صحيح.
?>

لا حاجة لتهيئة (initialize) المتغيرات في PHP على الرغم من أنها من الممارسات الجيدة في هذه اللغة، فالمتغيرات غير المهيّئة تمتلك قيمة افتراضية من نوعها تعتمد على السياق الذي استخدمت فيه، فالقيمة الافتراضية للمتغيرات المنطقية (Boolean) هي FALSE أما المتغيرات العددية integer و float تأخذ القيمة 0، والسلاسل النصية (كتلك المستخدمة في echo) تكون على هيئة سلسلة نصية فارغة والمصفوفات تصبح مصفوفات فارغة.

المثال 1: القيم الافتراضية لمتغيرات غير مهيّئة

<?php
// لم تُسند أي قيمة إلى المتغير ولم يشر إليه من طرف متغير آخر، النتيجة 
// NULL
var_dump($unset_var);

// المتغيرات المنطقية، النتيجة هي
// ‘false’
// (للتعرف على هذه الصيغة بشكل أكبر راجع المعاملات الثلاثية)
echo($unset_bool ? "true\n" : "false\n");

// السلاسل النصية، النتيجة
// 'string(3) "abc"'
$unset_str .= 'abc';
var_dump($unset_str);

// الأعداد الصحيحة، النتيجة
// 'int(25)'
$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int);

// الأعداد العشرية Float/Double
// النتيجة 'float(1.25)'
$unset_float += 1.25;
var_dump($unset_float);

// المصفوفة، النتيجة:
// array(1) {  [3]=>  string(3) "def" }
$unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($unset_arr);

// العناصر، يتم إنشاء كائن stdClass جديد (انظر http://www.php.net/manual/en/reserved.classes.php)
// النتيجة: object(stdClass)#1 (1) {  ["foo"]=>  string(3) "bar" }
$unset_obj->foo = 'bar';
var_dump($unset_obj);
?>

يؤدي الاعتماد على القيم الافتراضية للمتغيرات غير المهيّئة إلى حدوث مشاكل عند تضمين ملفّ في ملف آخر يستخدم أسماء المتغيّرات ذاتها، إضافة إلى أنّه يمثّل خطرًا أمنيًا كبيرًا في حال تفعيل register_globals. ينطلق خطأٌ من المستوى E_NOTICE في حال استخدام متغيرات غير مهيّئة، باستثناء الحالة التي يتم فيها إلحاق عناصر جديدة بمصفوفة غير مهيئة. يمكن التحقّق من كون المتغيّر مهيّئًا أم لا باستخدام البنية أو الدالة isset()‎.

المتغيرات المعرفة مسبقًا

تقدّم PHP عددًا كبيرًا من المتغيرات المعرّفة مسبقًا ضمن الشيفرات العاملة بهذه اللغة.

نطاق المتغيرات

النطاق (scope) هو السياق الذي تعرّف ضمنه المتغيرات.

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

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

المتغيرات من مصادر خارجية

وتأتي هذه المتغيرات أساسيًا عبر GET و POST (والكعكات).

مصادر