في هذا الدرس 6تصفّح المواضيع
تُنشئ كل دالة في PHP نطاقاً محلياً معزولاً (Local Scope) خاصاً بها في كل مرة يتم استدعاؤها. جميع المتغيرات المعرفة داخل الدالة — بما فيها معاملاتها — تعيش فقط داخل تلك الدالة وتُحذف من الذاكرة تلقائياً بمجرد انتهاء تنفيذ الدالة:
- منع تضارب الأسماء: يمكن لدالتين مختلفتين استخدام متغير محلي باسم
$totalدون أن يؤثر أحدهما على الآخر. - تحرير الذاكرة تلقائياً: يستعيد محرك 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
declare(strict_types=1);
$currency = "USD";
function showPrice(int $amount, string $unit): string
{
return $amount . " " . $unit;
}
echo showPrice(250, $currency);
رغم أن PHP توفر الكلمة المحجوزة global لربط متغير عام بداخل الدالة، إلا أن الهندسة البرمجية الحديثة تفضل دائماً تمرير البيانات صراحةً كمعاملات للدالة؛ لأن الاعتماد على global يربط الدالة بحالة خفية يصعب تتبعها، بينما يجعل تمرير المعاملات الدالة واضحة ومستقلة وسهلة الاختبار:
<?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 يهيئ قيمته الابتدائية مرة واحدة فقط عند أول استدعاء، ويحتفظ بقيمته المحدثة في الذاكرة عبر جميع الاستدعاءات التالية لنفس الدالة خلال الطلب الحالي:
<?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
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 = []; خارج الدالة | معزول تلقائياً (يُفضّل تمريره كمعامل) | يبقى حتى انتهاء تنفيذ الملف |
| متغير ساكن Static | static $count = 0; داخل الدالة | متاح داخل تلك الدالة فقط | يحتفظ بقيمته بين الاستدعاءات |
| ثابت Constant | const TAX = 0.15; | مرئي للقراءة مباشرة في كل النطاقات | ثابت غير قابل للتغيير طوال الطلب |
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
تعرفت في هذا الدرس على عزل النطاق المحلي داخل الدوال، وسبب عزل المتغيرات العامة تلقائياً في PHP، وأفضلية تمرير المعاملات على الكلمة global، وحفظ الحالة بين الاستدعاءات عبر static، ورؤية الثوابت في كافة النطاقات. الخطوة التالية: انتقل الآن إلى الدرس الثلاثين «الدوال المجهولة والسهمية ودوال الاستدعاء الراجع في PHP» لتمرير الدوال كقيم ومعالجة المصفوفات باحترافية.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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 ويرسلها إلى متصفح العميل بعد التنفيذ.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم عزل النطاق المحلي داخل الدالة للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم النطاق العام ولماذا يُعزل تلقائياً وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
ماذا يحدث للمتغير المحلي العادي المعرف داخل دالة PHP فور انتهاء تنفيذ الدالة؟
يعيش المتغير المحلي العادي طوال فترة تنفيذ الاستدعاء فقط ويُحذف من الذاكرة فور انتهاء الدالة.
في لغة PHP، يكون المتغير المعرف في النطاق العام خارج الدوال متاحاً للقراءة تلقائياً داخل كل دالة دون تمريره.
خطأ؛ تعزل لغة PHP نطاق الدالة عن المتغيرات العامة تلقائياً.
ما الممارسة القياسية الموصى بها في PHP الحديثة عندما تحتاج الدالة إلى بيانات موجودة في متغير خارجي؟
تمرير البيانات صراحةً عبر معاملات الدالة يجعل الدالة واضحة وسهلة الاختبار.
أي كلمة محجوزة تسمح لمتغير محلي داخل الدالة بالاحتفاظ بقيمته بين الاستدعاءات المتعددة لتلك الدالة؟
تحفظ الكلمة المحجوزة static قيمة المتغير المحلي عبر الاستدعاءات المتتالية.
إذا كانت الدالة counter() تحتوي على static $n = 0; $n++; return $n; فما القيمة التي يرجعها الاستدعاء الثالث للدالة؟
يتم تهيئة المتغير الساكن مرة واحدة فقط في الاستدعاء الأول، لذا يرجع الاستدعاء الثالث القيمة 3.
يمكن قراءة الثوابت المعرفة بالكلمة const في النطاق العام مباشرة داخل دوال PHP دون الحاجة لاستخدام الكلمة global.
صواب؛ تتمتع الثوابت برؤية شاملة عبر جميع الدوال والنطاقات في PHP.
هل يمكن لدالتين منفصلتين في PHP تعريف متغير محلي بنفس الاسم $result دون حدوث تعارض بينهما؟
نعم، لأن لكل دالة نطاقاً محلياً مستقلاً ومعزولاً في الذاكرة.
اختر جميع العبارات الصحيحة حول نطاقات المتغيرات في PHP 8.4:
معاملات الدالة محلية بداخلها، والمتغيرات الساكنة تحتفظ بقيمتها بين الاستدعاءات، والثوابت مرئية في كل مكان.