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

المتغيرات في PHP: التعريف والنطاق وglobal وstatic

يبدأ متغير PHP بالرمز $ ويُنشأ بإسناد قيمة إليه: $name = "Ada";. لا توجد كلمة مفتاحية للتعريف ولا نوع ثابت. لا ترى الدوال المتغيرات الخارجية ما لم تمررها إليها أو تستخدم global أو تلتقطها، وتحتفظ static بالقيمة بين الاستدعاءات.

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

متغير PHP اسم يبدأ بالرمز $، وتنشئه بإسناد قيمة إليه: $name = "Ada";. لا توجد كلمة مفتاحية للتعريف ولا نوع تحدده، لأن القيمة هي التي تحدد النوع. ويمكنك لاحقًا إسناد قيمة من نوع مختلف.

قواعد تسمية المتغيرات

يبدأ اسم المتغير بالرمز $، ثم حرف أو شرطة سفلية، ثم أي عدد من الأحرف أو الأرقام أو الشرطات السفلية. تُعد الأحرف غير اللاتينية أحرفًا، لذا فإن $名前 صالح، لكن الأسماء اللاتينية هي المعتادة. والأسماء حساسة لحالة الأحرف.

الاسمصالح؟
$total, $userName, $user_nameنعم
$_count, $item2نعم
$2itemsلا، لا يمكن أن يبدأ برقم
$user-nameلا، هذا $user ناقص name
$thisلا، محجوز للكائن الحالي، وإسناد قيمة إليه خطأ قاتل

إذن $city و$City و$CITY ثلاثة متغيرات مختلفة. استخدم snake_case ($first_name) أو camelCase ($firstName)، والتزم بأسلوب واحد في كل مشروع. تترك معايير الكتابة PSR تسمية المتغيرات مفتوحة عمدًا، ويستخدم كود Laravel وSymfony غالبًا camelCase.

استخدام المتغيرات داخل النصوص

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

تشرح صفحة النصوص علامات التنصيص والربط والاستيفاء بالتفصيل.

المتغيرات غير المعرّفة والقيم الافتراضية

قراءة متغير لم تُسند إليه قيمة قط تعطي null، وتطبع PHP على جهازك تحذيرًا:

Warning: Undefined variable $discount in /home/index.php on line 3

تحقق أولًا بـ isset، أو استخدم عامل الدمج مع null ?? لتوفير قيمة افتراضية. كلاهما يعمل دون تحذير:

$x ??= 0; هي الصيغة المختصرة لـ $x = $x ?? 0;. وقيم النماذج والروابط هي الحالة المعتادة: $page = $_GET['page'] ?? 1;.

نطاق المتغيرات في الدوال

المتغيرات المعرّفة خارج الدالة غير مرئية داخلها، والمتغيرات المنشأة داخل الدالة تختفي عند عودتها. وهذه أكثر مفاجأة شيوعًا للقادمين من JavaScript:

دون ?? 0، ستحذّر الدالة الأولى من أن $taxRate غير معرّف. تمرير القيم كمعاملات يجعل الدوال متوقعة السلوك وسهلة الاختبار، وهو أول ما يجب أن تلجأ إليه. تشرح صفحة الدوال المعاملات والقيم المعادة.

الكلمة المفتاحية global و$GLOBALS

عندما يجب على الدالة فعلًا استخدام متغير عام، صرّح به بـ global، أو استخدم المصفوفة $GLOBALS، التي تحمل كل متغير عام باسمه:

المتغيرات العامة تجعل الكود أصعب في التتبع، لأن أي دالة تستطيع تغييرها. وهي تظهر في الكود القديم وفي إضافات ووردبريس (global $wpdb;)، أما في الكود الجديد فمرّر القيم أو استخدم صنفًا.

المتغيرات static تحتفظ بقيمتها

يُنشأ المتغير static داخل الدالة مرة واحدة ويحتفظ بقيمته بين الاستدعاءات. وهو يبقى محليًا: لا يستطيع الكود خارج الدالة رؤيته.

متغيرات المتغيرات ($$name)

يستخدم $$name قيمة $name اسمًا لمتغير آخر. هذا يعمل، لكن المصفوفات تؤدي العمل نفسه بوضوح أكبر في كل الحالات تقريبًا:

<?php
$field = "color";
$$field = "blue";        // creates $color
echo $color, "\n";

// The clearer way to have names chosen at runtime:
$settings = [];
$settings[$field] = "blue";
echo $settings["color"], "\n";

النسخ أو المرجع

إسناد متغير إلى آخر ينسخ القيمة، والمصفوفات كذلك. ضع & قبله ليشير الاسمان إلى القيمة نفسها بدلًا من ذلك:

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

خطأ شائع: متغير يُعيَّن داخل if أو حلقة

ليس في PHP نطاق للكتل، لذا فالمتغير المنشأ داخل if أو for أو foreach يبقى موجودًا بعدها. هذا مفيد، لكنه يخفي خطأً: عندما لا تُنفَّذ الكتلة، لا يُنشأ المتغير أصلًا.

دون سطر القيمة الافتراضية، ستترك $orders الفارغة المتغير $message غير معرّف وتطبع تحذيرًا. أعطِ كل متغير قيمة قبل الكتلة التي قد تعيّنه.

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

كيف تعرّف متغيرًا في PHP؟

أسند قيمة إلى اسم يبدأ بالرمز $: $count = 10;. ليس في PHP كلمة مفتاحية مثل var أو let ولا نوع في التعريف، فالمتغير يُنشأ عند أول إسناد ويأخذ نوع قيمته.

لماذا لا ترى دالتي متغيرًا معرّفًا خارجها؟

لدوال PHP نطاقها المحلي الخاص، ولا ترى المتغيرات العامة تلقائيًا. مرّر القيمة كمعامل (الخيار النظيف)، أو صرّح بـ global $name; داخل الدالة، أو اقرأ $GLOBALS['name']. ويمكن للدوال المغلقة (closures) التقاطه بـ use ($name)، أما الدوال السهمية fn() فتلتقطه تلقائيًا.

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

متغير محلي يُعرَّف بـ static داخل دالة، مثل static $calls = 0;. يُهيَّأ مرة واحدة ويحتفظ بقيمته بين استدعاءات تلك الدالة، وهذا مفيد للعدّادات والتخزين المؤقت البسيط.

هل أسماء المتغيرات في PHP حساسة لحالة الأحرف؟

نعم. $name و$Name و$NAME ثلاثة متغيرات مختلفة. أما أسماء الدوال والأصناف فغير حساسة لحالة الأحرف في PHP.

كيف أحذف متغيرًا في PHP؟

استدعِ unset($name);. بعد ذلك تكون isset($name) مساوية لـ false، وقراءته تعطي التحذير "Undefined variable". أما إسناد null فيبقي المتغير لكنه يفرغه.

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

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

ابدأ الآن