انتقل إلى محتوى الدرس
الدرس 40
دورة PHP

نطاق المتغيرات المحلي والعام والمتغيرات الساكنة في PHPPHP Variable Scope and Static Variables

تعلّم نطاق المتغيرات المحلي والعام والمتغيرات الساكنة في PHP بأسلوب PHP 8 الحديث مع أمثلة عملية وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
2
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

تُنشئ كل دالة في PHP نطاقاً محلياً معزولاً (Local Scope) خاصاً بها في كل مرة يتم استدعاؤها. جميع المتغيرات المعرفة داخل الدالة — بما فيها معاملاتها — تعيش فقط داخل تلك الدالة وتُحذف من الذاكرة تلقائياً بمجرد انتهاء تنفيذ الدالة:

  • منع تضارب الأسماء: يمكن لدالتين مختلفتين استخدام متغير محلي باسم $total دون أن يؤثر أحدهما على الآخر.
  • تحرير الذاكرة تلقائياً: يستعيد محرك PHP ذاكرة المتغيرات المحلية فور خروج الدالة.
مخطط يقارن النطاق المحلي والنطاق العام والمتغيرات الساكنة في لغة PHP
PHP
<?php
declare(strict_types=1);

function computeCartTax(): float
{
    $rate = 0.15;
    return 100 * $rate;
}

echo "Tax: " . computeCartTax();

على عكس لغات أخرى مثل JavaScript التي ترث فيها الدوال متغيرات الملف الخارجي تلقائياً، تفرض لغة PHP عزلاً صارماً للنطاق العام (Global Scope Isolation)؛ فالمتغير المعرف خارج الدالة في الملف الرئيسي لا يمكن قراءته داخل الدالة تلقائياً، ومحاولة استخدامه مباشرة داخل الدالة تُطلق تحذير متغير غير معرف (Undefined variable):

PHP
<?php
declare(strict_types=1);

$currency = "USD";

function showPrice(int $amount, string $unit): string
{
    return $amount . " " . $unit;
}

echo showPrice(250, $currency);

رغم أن PHP توفر الكلمة المحجوزة global لربط متغير عام بداخل الدالة، إلا أن الهندسة البرمجية الحديثة تفضل دائماً تمرير البيانات صراحةً كمعاملات للدالة؛ لأن الاعتماد على global يربط الدالة بحالة خفية يصعب تتبعها، بينما يجعل تمرير المعاملات الدالة واضحة ومستقلة وسهلة الاختبار:

PHP
<?php
declare(strict_types=1);

$siteDiscount = 0.20;

// Best Practice: Pass explicitly as typed parameter
function applyPromo(float $price, float $discount): float
{
    return $price * (1 - $discount);
}

echo "Final: " . applyPromo(500.0, $siteDiscount);

تُمسح المتغيرات المحلية عادةً فور انتهاء الدالة؛ لكن إذا عرّفت متغيراً محلياً مسبوقاً بالكلمة المحجوزة static (مثل static $step = 0;)، فإن محرك PHP يهيئ قيمته الابتدائية مرة واحدة فقط عند أول استدعاء، ويحتفظ بقيمته المحدثة في الذاكرة عبر جميع الاستدعاءات التالية لنفس الدالة خلال الطلب الحالي:

مخطط تدفق التنفيذ العملي لقسم حفظ حالة المتغير بالكلمة static في لغة PHP
PHP
<?php
declare(strict_types=1);

function generateRequestSeq(): string
{
    static $seq = 100;
    $seq++;
    return "REQ-" . $seq;
}

echo generateRequestSeq() . "\n";
echo generateRequestSeq() . "\n";
echo generateRequestSeq();

على عكس المتغيرات، تتمتع الثوابت المعرفة عبر const أو define() برؤية شاملة عبر جميع النطاقات. ولأن الثوابت غير قابلة للتعديل أو الكتابة فوقها بالخطأ، يسمح لك محرك PHP بقراءتها مباشرة داخل أي دالة دون الحاجة لتمريرها أو استخدام الكلمة global:

PHP
<?php
declare(strict_types=1);

const MAX_RETRY_LIMIT = 3;

function canRetryAttempt(int $attempt): bool
{
    return $attempt <= MAX_RETRY_LIMIT;
}

var_dump(canRetryAttempt(2));
var_dump(canRetryAttempt(5));

يقارن الجدول المرجعي التالي بين أنواع النطاقات ودورة حياة كل منها في لغة PHP 8.4:

نوع النطاقطريقة التعريفإمكانية الوصول داخل الدالةفترة البقاء في الذاكرة
متغير محلي Local$total = 0; داخل الدالةمتاح داخل تلك الدالة فقطيُحذف فور انتهاء استدعاء الدالة
متغير عام Global$config = []; خارج الدالةمعزول تلقائياً (يُفضّل تمريره كمعامل)يبقى حتى انتهاء تنفيذ الملف
متغير ساكن Staticstatic $count = 0; داخل الدالةمتاح داخل تلك الدالة فقطيحتفظ بقيمته بين الاستدعاءات
ثابت Constantconst TAX = 0.15;مرئي للقراءة مباشرة في كل النطاقاتثابت غير قابل للتغيير طوال الطلب
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

تعرفت في هذا الدرس على عزل النطاق المحلي داخل الدوال، وسبب عزل المتغيرات العامة تلقائياً في PHP، وأفضلية تمرير المعاملات على الكلمة global، وحفظ الحالة بين الاستدعاءات عبر static، ورؤية الثوابت في كافة النطاقات. الخطوة التالية: انتقل الآن إلى الدرس الثلاثين «الدوال المجهولة والسهمية ودوال الاستدعاء الراجع في PHP» لتمرير الدوال كقيم ومعالجة المصفوفات باحترافية.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Variable Scope نطاق المتغيرات
تعلّم نطاق المتغيرات المحلي والعام والمتغيرات الساكنة في PHP بأسلوب PHP 8 الحديث مع أمثلة عملية وتطبيقات تفاعلية.
للمراجعة
02 Local Function Scope Isolation عزل النطاق المحلي داخل الدالة
المفهوم الأساسي لقسم عزل النطاق المحلي داخل الدالة في لغة PHP الحديثة.
للمراجعة
03 Global Variable Scope Isolation النطاق العام ولماذا يُعزل تلقائياً
الصياغة البرمجية والتطبيق العملي المباشر لقسم النطاق العام ولماذا يُعزل تلقائياً.
للمراجعة
04 Passing Arguments vs global Keyword تمرير المعاملات مقابل الكلمة global
قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم تمرير المعاملات مقابل الكلمة global.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 PHP PHP
PHP: Hypertext Preprocessor
لغة البرمجة النصية على جانب الخادم لبناء تطبيقات الويب الديناميكية وواجهات البرمجة.
للمراجعة
02 CLI CLI
Command-Line Interface
واجهة سطر الأوامر التي تتيح تشغيل ملفات PHP مباشرة عبر الطرفية.
للمراجعة
03 FPM FPM
FastCGI Process Manager
مدير عمليات FastCGI عالي الأداء لمعالجة طلبات خادم الويب في PHP.
للمراجعة
04 HTML HTML
HyperText Markup Language
لغة الترميز القياسية التي يولدها محرك PHP ويرسلها إلى متصفح العميل بعد التنفيذ.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم عزل النطاق المحلي داخل الدالة للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم النطاق العام ولماذا يُعزل تلقائياً وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

ماذا يحدث للمتغير المحلي العادي المعرف داخل دالة PHP فور انتهاء تنفيذ الدالة؟

يعيش المتغير المحلي العادي طوال فترة تنفيذ الاستدعاء فقط ويُحذف من الذاكرة فور انتهاء الدالة.

02

في لغة PHP، يكون المتغير المعرف في النطاق العام خارج الدوال متاحاً للقراءة تلقائياً داخل كل دالة دون تمريره.

خطأ؛ تعزل لغة PHP نطاق الدالة عن المتغيرات العامة تلقائياً.

03

ما الممارسة القياسية الموصى بها في PHP الحديثة عندما تحتاج الدالة إلى بيانات موجودة في متغير خارجي؟

تمرير البيانات صراحةً عبر معاملات الدالة يجعل الدالة واضحة وسهلة الاختبار.

04

أي كلمة محجوزة تسمح لمتغير محلي داخل الدالة بالاحتفاظ بقيمته بين الاستدعاءات المتعددة لتلك الدالة؟

تحفظ الكلمة المحجوزة static قيمة المتغير المحلي عبر الاستدعاءات المتتالية.

05

إذا كانت الدالة counter() تحتوي على static $n = 0; $n++; return $n; فما القيمة التي يرجعها الاستدعاء الثالث للدالة؟

يتم تهيئة المتغير الساكن مرة واحدة فقط في الاستدعاء الأول، لذا يرجع الاستدعاء الثالث القيمة 3.

06

يمكن قراءة الثوابت المعرفة بالكلمة const في النطاق العام مباشرة داخل دوال PHP دون الحاجة لاستخدام الكلمة global.

صواب؛ تتمتع الثوابت برؤية شاملة عبر جميع الدوال والنطاقات في PHP.

07

هل يمكن لدالتين منفصلتين في PHP تعريف متغير محلي بنفس الاسم $result دون حدوث تعارض بينهما؟

نعم، لأن لكل دالة نطاقاً محلياً مستقلاً ومعزولاً في الذاكرة.

08

اختر جميع العبارات الصحيحة حول نطاقات المتغيرات في PHP 8.4:

معاملات الدالة محلية بداخلها، والمتغيرات الساكنة تحتفظ بقيمتها بين الاستدعاءات، والثوابت مرئية في كل مكان.